【问题标题】: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' 工作

标签: javascript node.js ecmascript-6 symbols


【解决方案1】:

用 typeof 检查它:

typeof x === 'symbol'

【讨论】:

【解决方案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]';
}

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多