ES6中.toString()
上有一个Symbol
,它返回Symbol
的字符串表示形式,但想知道为什么'' + Symbol()
无效(运行此表达式抛出)我不期待的那个TypeError
?后者只是在新.toString()
上调用Symbol
并将其追加(+
)为空字符串吗?
答案 0 :(得分:13)
后者只是在新
.toString()
上调用Symbol
并将其附加(+
)为空字符串吗?
实际上,符号不能隐式地转换为字符串或数字,尽管有趣的是你可以隐式地将它们转换为布尔值。
MDN actually has a section关于其中一些陷阱:
符号类型转换
使用符号类型转换时需要注意的一些事项。
- 尝试将符号转换为数字时,系统会引发
TypeError
(例如+sym
或sym | 0
)。- 使用宽松的平等时,
Object(sym) == sym
会返回true.
Symbol("foo") + "bar"
抛出TypeError
(无法将符号转换为字符串)。这可以防止您从符号中静默创建新的字符串属性名称,例如。- “更安全”的
String(sym)
转换就像使用符号调用Symbol.prototype.toString()
一样,但请注意new String(sym)
将会抛出。
此行为记录在abstract ToString
operation:
参数类型:符号
结果:抛出
TypeError
例外。
同样适用于abstract ToNumber
operation:
参数类型:符号
结果:抛出
TypeError
例外。
要将Symbol
投射到没有TypeError
的字符串,您必须使用toString
方法或String()
。
答案 1 :(得分:1)
来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toString。
Symbol对象覆盖Object对象的toString方法; 它不继承Object.prototype.toString()。对于Symbol对象, toString方法返回对象的字符串表示。