如何检查JS中的符号是否为符号?
我没有看到Symbol.isSymbol()
方法。我对(x instanceof Symbol)
的测试似乎也不起作用。
答案 0 :(得分:10)
使用typeof:
进行检查typeof x === 'symbol'
答案 1 :(得分:4)
在ES 2015及更高版本中,仅需typeof x === 'symbol'
。但是,即使您将内置代码Symbol
使用的是polyfill,也无法将代码转换为ES 5.1或更早版本。
我见过的每一个polyfill,包括babel-polyfill,都使用称为typeof x === 'object'
的构造函数将Symbol作为对象(即Symbol
)实现。因此,在这种情况下,您可以检查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
通常可以正常工作,但是如果您的代码有可能像我描述的那样处于“多帧”情况下,请谨慎使用!
答案 2 :(得分:0)
最有效的方法是测试一个值的构造函数:
const result = (value && value.constructor === Symbol);