[ES6中.toString()
上有一个Symbol
,它返回Symbol
的字符串表示形式,但想知道为什么'' + Symbol()
不起作用(运行此表达式会抛出我没想到的TypeError
) ?后者只是在新的.toString()
上调用Symbol
并将其附加(+
)到空字符串吗?
后者是否只是在新的
.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下:
参数类型:符号
结果:引发
ToString
异常。
[对于TypeError
同样:
参数类型:符号
结果:引发abstract
ToNumber
operation异常。
[将ToNumber
强制转换为没有TypeError
的字符串,必须使用Symbol
方法或TypeError
。
来自toString
。
Symbol对象覆盖Object对象的toString方法;它不继承Object.prototype.toString()。对于符号对象,toString方法返回对象的字符串表示形式。