检查值是否为JavaScript中的符号

Ale*_*lls 11 javascript symbols node.js ecmascript-6

如何检查JS中的值是否为Symbol?

我没有看到一种Symbol.isSymbol()方法.我的测试(x instanceof Symbol)似乎也没有用.

jor*_*gos 14

用typeof检查:

typeof x === 'symbol'
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是一个原始的 (3认同)

dae*_*ina 5

在 ES 2015 及更高版本中,typeof x === 'symbol'这就是所需要的。但是,如果您将代码转换为 ES 5.1 或更早版本,即使您使用 polyfill 作为Symbol内置代码,它也不会起作用。

我见过的每个 polyfill,包括 babel-polyfill,都typeof x === 'object'使用名为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]';
}
Run Code Online (Sandbox Code Playgroud)

*请注意,我没有instanceof在转译的场景中使用。问题instanceof在于它只对在与断言相同的全局上下文中创建的对象返回 true。因此,如果网络工作者将符号传递回您的页面,或者符号在 iframe 之间传递,x instanceof Symbol则将返回 false!这一直适用于所有对象类型,包括内置函数。instanceof通常工作得很好,但是如果您的代码有可能像我所描述的那样处于“多帧”场景中,请谨慎使用!