为什么 Symbol('test').toString()
工作正常,但我不能使用 '' + Symbol('test')
?
它会抛出错误:
无法将 Symbol 值转换为字符串
为什么隐式类型转换不起作用?为什么代码不等于 '' + Symbol('test').toString()
?
原文由 SkyAo 发布,翻译遵循 CC BY-SA 4.0 许可协议
为什么 Symbol('test').toString()
工作正常,但我不能使用 '' + Symbol('test')
?
它会抛出错误:
无法将 Symbol 值转换为字符串
为什么隐式类型转换不起作用?为什么代码不等于 '' + Symbol('test').toString()
?
原文由 SkyAo 发布,翻译遵循 CC BY-SA 4.0 许可协议
你可以,但是你并不是偶然这样做的。
console.log(''+String(Symbol('My symbol!')))
// Symbol(My other symbol!)
console.log(Symbol('My symbol!').description)
// My other symbol!
console.log(Symbol.keyFor(Symbol.for('My other symbol!')))
// My other symbol!
注意:
Symbol.keyFor
仅适用于通过Symbol.for
函数创建的符号。
Symbol.keyFor(Symbol('My symbol!'))
将评估为undefined
。您还可以使用
.description
获取用于创建符号的字符串值。
原文由 John Leidegren 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
根据 ECMA-262,在 Symbol 类型的值上使用 加法运算符 并结合字符串值首先调用内部 ToPrimitive ,它返回符号。然后它调用内部 ToString ,对于 Symbols,它将抛出 TypeError 异常。
所以调用内部 ToString 与调用 Symbol.prototype.toString 不同。
所以我猜答案是:
是“ _因为规范是这样说的_”。