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()方法混淆。