Symbol() + ''
抛出
TypeError:无法将Symbol值转换为字符串
虽然已知的解决方法是使用String(Symbol())
。
这看起来与其他原语不一致,包括那些几乎永远不会被强制的原语(undefined
和null
)。
String
与+ ''
的确切区别(除了它有效)?规范是否明确指定String
应该接受符号?以一种方式允许它而在另一种方式中允许它的动机是什么?
答案 0 :(得分:4)
String与+''的确切区别(除了它有效)?规范是否明确指定String应该接受符号?
它们在String()
具有Symbol()
的情况方面有所不同,而+
运算符(用于连接时)直接调用抛出的ToString()
操作TypeError
的{{1}}例外。
来自Symbol()
规范:
如果NewTarget未定义且Type(value)为Symbol,则返回SymbolDescriptiveString(value)。
来自String()
评估规范:
如果Type(lprim)是String或Type(rprim)是String,那么
- 让lstr成为ToString(lprim)。
- ReturnIfAbrupt(LSTR)。
- 让rstr成为ToString(rprim)。
- ReturnIfAbrupt(RSTR)。
- 返回串联lstr和rstr的结果的字符串。
注意:+
和lprim
的定义来自评估过程中的前10个步骤,其中涉及获取表达式边的基本类型和值。我没有包括它们以保持这篇文章更短。我已经链接了我在下面引用的每个规范。
来自rprim
输出:
符号:抛出TypeError异常。
至于你的最后一个问题:
以一种方式允许它并在另一种方式中禁止它的动机是什么?
这对ECMA国际的作家来说是件好事。