检查值是不是是 JavaScript 中的符号
Posted
技术标签:
【中文标题】检查值是不是是 JavaScript 中的符号【英文标题】:Check if value is a Symbol in JavaScript检查值是否是 JavaScript 中的符号 【发布时间】:2018-03-10 18:56:10 【问题描述】:如何在 JS 中检查一个值是否是 Symbol?
我没有看到Symbol.isSymbol()
方法。我对(x instanceof Symbol)
的测试似乎也不起作用。
【问题讨论】:
typeof x === 'symbol'
工作
【参考方案1】:
用 typeof 检查它:
typeof x === 'symbol'
【讨论】:
是的,谢谢,我终于在这篇文章中发现了keithcirkel.co.uk/metaprogramming-in-es6-symbols 我猜它是一个原语而不是一个对象,也许为什么 instanceof 不起作用? 是的,它是一个原语 另外,developer.mozilla.org/en-US/docs/Web/javascript/Reference/…【参考方案2】:在 ES 2015 及更高版本中,只需 typeof x === 'symbol'
。但是,如果您将代码转换为 ES 5.1 或更早版本,即使您为 Symbol
内置函数使用 polyfill,它也不起作用。
我见过的每个 polyfill,包括 babel-polyfill,都使用名为 Symbol
的构造函数将 Symbol 实现为对象(即 typeof x === 'object'
)。所以在这些情况下你可以检查Object.prototype.toString.call (x) === '[object Symbol]'
*。
综合起来,我们得到:
function isSymbol (x)
return typeof x === 'symbol'
|| typeof x === 'object' && Object.prototype.toString.call (x) === '[object Symbol]';
*请注意,我没有在转译场景中使用instanceof
。 instanceof
的问题在于它只对在与断言相同的全局上下文中创建的对象返回 true。因此,如果网络工作者将符号传回您的页面,或者符号在 iframe 之间传递,那么 x instanceof Symbol
将返回 false!这对所有对象类型都是如此,包括内置函数。 instanceof
通常工作得很好,但是如果您的代码有可能像我所描述的那样处于“多帧”场景中,请谨慎使用!
【讨论】:
【参考方案3】:最有效的方法是测试一个值的构造函数:
const result = (value && value.constructor === Symbol);
【讨论】:
以上是关于检查值是不是是 JavaScript 中的符号的主要内容,如果未能解决你的问题,请参考以下文章
如何检查一个值是不是是javascript中的浮点数[重复]
如何根据 JavaScript 中的值检查对象是不是在数组中?
JavaScript - 如何检查是不是在数字输入字段中输入了字母字符或符号[重复]