为什么隐式符号转换为字符串会导致JavaScript中的TypeError?

问题描述 投票:10回答:2

[ES6中.toString()上有一个Symbol,它返回Symbol的字符串表示形式,但想知道为什么'' + Symbol()不起作用(运行此表达式会抛出我没想到的TypeError) ?后者只是在新的.toString()上调用Symbol并将其附加(+)到空字符串吗?

javascript ecmascript-6 symbols
2个回答
14
投票

后者是否只是在新的.toString()上调用Symbol并将其附加(+)到空字符串?

实际上,不可以将符号隐式转换为字符串或数字,尽管有趣的是,您可以将它们隐式转换为布尔值。

MDN actually has a section关于这些陷阱:

符号类型转换

使用符号的类型转换时要注意的一些事情。

  • [当尝试将符号转换为数字时,将抛出TypeError(例如+symsym | 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


1
投票

来自toString

Symbol对象覆盖Object对象的toString方法;它不继承Object.prototype.toString()。对于符号对象,toString方法返回对象的字符串表示形式。

© www.soinside.com 2019 - 2024. All rights reserved.