符号字符串强制转换

2024-04-24

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(使用前将#替换为@)

符号字符串强制转换 的相关文章