javascript - 符号字符串强制转换

标签 javascript ecmascript-6 primitive-types coercion

Symbol() + '' 抛出

TypeError: Cannot convert a Symbol value to a string

虽然已知的解决方法是使用 String(Symbol())

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

String+ '' 究竟有何不同(除了它可以工作)?规范是否明确指定 String 应接受符号?以某种方式允许它而以另一种方式不允许它的动机是什么?

最佳答案

How exactly does String differ from + '' (except it works)? Do specs explicitly specify that String should accept symbols?

它们的不同之处在于 String() 有一个 Symbol() 的情况,而 + 运算符(当用于concatenation)直接调用 ToString() 操作,该操作会引发 Symbol()TypeError 异常。

来自String()规范:

If NewTarget is undefined and Type(value) is Symbol, return SymbolDescriptiveString(value).

来自+评估规范:

If Type(lprim) is String or Type(rprim) is String, then

  • Let lstr be ToString(lprim).
    • ReturnIfAbrupt(lstr).
    • Let rstr be ToString(rprim).
    • ReturnIfAbrupt(rstr).
    • Return the String that is the result of concatenating lstr and rstr.

注意:lprimrprim 的定义来自评估过程中的前 10 个步骤,其中涉及获取表达式两侧的基本类型和值。我没有包括它们是为了让这篇文章更短。我已经链接了下面引用的每个规范。

ToString() 输出:

Symbol: Throw a TypeError exception.

至于你的最后一个问题:

What were the motives to allow it in one way and disallow it in another?

这是 ECMA International 的作者的事情。

String() ES6 Spec

+ operator runtime evaluation ES6 Spec

ToString() Output behavior ES6 Spec

关于javascript - 符号字符串强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45354760/

相关文章:

javascript - 如何在flowjs中指定一个可以未定义的参数

javascript - 谷歌地图 : marker icon and popup window

javascript - 如何将 13-04-2023 转换为 MMM Do YYYY 在 JavaScript 中?

javascript - 应用程序汇总和树摇动

java - 我可以在不破坏向后兼容性的情况下将 Java 中的常量从 int 更改为 byte 吗?

C#、反射和原始类型

javascript - 可变大小的 JavaScript 字符串如何成为原始类型?

javascript - 如何删除紧跟在 <hr> 之后的 <hr>?

javascript - React 中的类分配

reactjs - 单击按钮打开模式