检查值是否为 JavaScript 中的符号
Check if value is a Symbol in JavaScript
如何在 JS 中判断一个值是否为 Symbol?
我没有看到 Symbol.isSymbol(x)
方法。我对 (x instanceof Symbol)
的测试似乎也不起作用。
用typeof检查:
typeof x === 'symbol'
2022 年更新:接受公认的答案! 如果您在一个过时的环境中工作 Symbol
需要填充, 那么你就会知道了。你会非常清楚地意识到这一点。你会被它困扰。然后,当然,使用我的答案。否则不要打扰。 typeof x === 'symbol'
这些天几乎肯定是您所需要的。
在 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
的问题在于它只对在与断言相同的全局上下文中创建的对象 return 为真。因此,如果网络工作者将一个符号传回您的页面,或者符号在 iframe 之间传递,那么 x instanceof Symbol
将 return 为假!这对所有对象类型都是如此,包括内置函数。 instanceof
通常工作得很好,但如果您的代码有可能出现我所描述的“多帧”场景,请谨慎使用!
最有效的方法是测试一个值的构造函数:
const result = (value && value.constructor === Symbol);
如何在 JS 中判断一个值是否为 Symbol?
我没有看到 Symbol.isSymbol(x)
方法。我对 (x instanceof Symbol)
的测试似乎也不起作用。
用typeof检查:
typeof x === 'symbol'
2022 年更新:接受公认的答案! 如果您在一个过时的环境中工作 Symbol
需要填充, 那么你就会知道了。你会非常清楚地意识到这一点。你会被它困扰。然后,当然,使用我的答案。否则不要打扰。 typeof x === 'symbol'
这些天几乎肯定是您所需要的。
在 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
的问题在于它只对在与断言相同的全局上下文中创建的对象 return 为真。因此,如果网络工作者将一个符号传回您的页面,或者符号在 iframe 之间传递,那么 x instanceof Symbol
将 return 为假!这对所有对象类型都是如此,包括内置函数。 instanceof
通常工作得很好,但如果您的代码有可能出现我所描述的“多帧”场景,请谨慎使用!
最有效的方法是测试一个值的构造函数:
const result = (value && value.constructor === Symbol);