检查值是否为JavaScript中的符号

时间:2017-09-28 22:27:32

标签: javascript node.js ecmascript-6 symbols

如何检查JS中的符号是否为符号?

我没有看到Symbol.isSymbol()方法。我对(x instanceof Symbol)的测试似乎也不起作用。

3 个答案:

答案 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]';
}

*请注意,在转换的场景中我没有使用instanceofinstanceof的问题在于,它仅对于在与声明相同的全局上下文中创建的对象返回true。因此,如果说某个网络工作者将符号传递回您的页面,或者在iframe之间传递了符号,那么x instanceof Symbol将返回false!所有对象类型(包括内置对象)始终都是如此。 instanceof通常可以正常工作,但是如果您的代码有可能像我描述的那样处于“多帧”情况下,请谨慎使用!

答案 2 :(得分:0)

最有效的方法是测试一个值的构造函数:

const result = (value && value.constructor === Symbol);