Symbol() + ''
throws
类型错误:无法将符号值转换为字符串
虽然已知的解决方法是使用String(Symbol())
.
这看起来与其他原语不一致,包括那些几乎不应该被强制的原语(undefined
and null
).
究竟如何String
与......不同+ ''
(除非它有效)?规格是否明确指定String
应该接受符号吗?以某种方式允许它而以另一种方式不允许它的动机是什么?
String 与 + '' 究竟有何不同(除了它可以工作)?规范是否明确指定 String 应该接受符号?
它们的不同之处在于String()
有一个案例Symbol()
,而+
运算符(当用于串联时)直接调用ToString()
抛出一个操作TypeError
例外情况Symbol()
.
From String()
spec:
如果 NewTarget 未定义且 Type(value) 为 Symbol,则返回 SymbolDescriptiveString(value)。
From +
评估规格:
如果 Type(lprim) 是 String 或 Type(rprim) 是 String,则
- Let lstr be ToString(lprim).
- ReturnIfAbrupt(lstr)。
- 令 rstr 为 ToString(rprim)。
- ReturnIfAbrupt(rstr)。
- 返回作为 lstr 和 rstr 连接结果的字符串。
注:定义为lprim
and rprim
来自评估过程中的前 10 个步骤,其中涉及获取表达式两侧的基本类型和值。我没有包括它们是为了让这篇文章更短。我已经链接了下面引用的每个规范。
来自ToString()
output:
符号:抛出 TypeError 异常。
至于你的最后一个问题:
以某种方式允许它而以另一种方式不允许它的动机是什么?
这对 ECMA International 的作者来说是件好事。
String() ES6 规范 http://www.ecma-international.org/ecma-262/6.0/#sec-string-constructor-string-value
+ 算子运行时评估 ES6 Spec http://www.ecma-international.org/ecma-262/6.0/#sec-addition-operator-plus-runtime-semantics-evaluation
ToString() 输出行为 ES6 规范 http://www.ecma-international.org/ecma-262/6.0/#sec-tostring
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)