Javascript 符号字符串强制

Javascript 符号字符串强制,javascript,ecmascript-6,primitive-types,coercion,Javascript,Ecmascript 6,Primitive Types,Coercion,Symbol()+“”抛出 TypeError:无法将符号值转换为字符串 而已知的解决方法是使用字符串(Symbol()) 这看起来与其他原语不一致,包括那些几乎不应该被强制的原语(undefined和null) String与+'的区别到底有多大(除非它能工作)?规范是否明确规定String应接受符号?以一种方式允许而以另一种方式不允许的动机是什么 字符串与+''的具体区别是什么(除了它的工作原理)?规范是否明确指定字符串应接受符号 它们的不同之处在于String()有一个Symbol()的案

Symbol()+“”
抛出

TypeError:无法将符号值转换为字符串

而已知的解决方法是使用
字符串(Symbol())

这看起来与其他原语不一致,包括那些几乎不应该被强制的原语(
undefined
null

String
+'
的区别到底有多大(除非它能工作)?规范是否明确规定
String
应接受符号?以一种方式允许而以另一种方式不允许的动机是什么

字符串与+''的具体区别是什么(除了它的工作原理)?规范是否明确指定字符串应接受符号

它们的不同之处在于
String()
有一个
Symbol()
的案例,而
+
操作符(用于连接时)直接调用
ToString()
操作,该操作会为
Symbol()
抛出一个
类型错误
异常

String()
spec:

如果NewTarget未定义且类型(值)为Symbol,则返回SymbolDescriptiveString(值)

+
评估规范:

如果类型(lprim)为字符串或类型(rprim)为字符串,则

  • 设lstr为ToString(lprim)。
    • 返回初始值(lstr)
    • 设rstr为ToString(rprim)
    • 返回IFABRUPT(rstr)
    • 返回连接lstr和rstr的结果字符串
注意:
lprim
rprim
的定义来自计算过程中前面的10个步骤,这些步骤涉及获取表达式边的基元类型和值。我没有把它们包括进来,以缩短这篇文章的篇幅。我已经链接了我在下面引用的每个规范

ToString()
输出:

Symbol:引发TypeError异常

关于你的最后一个问题:

以一种方式允许而以另一种方式不允许的动机是什么

这是ECMA国际的编剧们应该做的


为什么??符号并不意味着要暴露somewhere@Jonasw:它仍然是一个基元类型,因此它的工作方式应该与涉及类型强制的其他基元类型完全相同。这确实是一个很有趣的问题。我能想到的唯一一件事是它不可枚举,但仍然可以使用
string
将其转换为字符串,因此听起来确实像是一个错误。@Jonasw我第一次在错误日志记录中遇到这个问题。一个简单的“对象没有”${prop}`会抛出一个错误,除非您使用
String(prop)
来保护它。这不是一件很好的事情,但这就是它的工作原理。@estus是的,这可能是一个用例。.我想应该把它称为ToString()操作,以免读者把它与ToString()方法混淆。