符号字符串强制

时间:2017-07-27 15:13:07

标签: javascript ecmascript-6 primitive-types coercion

Symbol() + ''抛出

  

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

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

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

String+ ''的确切区别(除了它有效)?规范是否明确指定String应该接受符号?以一种方式允许它而在另一种方式中允许它的动机是什么?

1 个答案:

答案 0 :(得分:4)

  

String与+''的确切区别(除了它有效)?规范是否明确指定String应该接受符号?

它们在String()具有Symbol()的情况方面有所不同,而+运算符(用于连接时)直接调用抛出的ToString()操作TypeError的{​​{1}}例外。

来自Symbol()规范:

  

如果NewTarget未定义且Type(value)为Symbol,则返回SymbolDescriptiveString(value)。

来自String()评估规范:

  

如果Type(lprim)是String或Type(rprim)是String,那么

     
      
  • 让lstr成为ToString(lprim)。      
        
    • ReturnIfAbrupt(LSTR)。
    •   
    • 让rstr成为ToString(rprim)。
    •   
    • ReturnIfAbrupt(RSTR)。
    •   
    • 返回串联lstr和rstr的结果的字符串。
    •   
  •   

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

来自rprim输出:

  

符号:抛出TypeError异常。

至于你的最后一个问题:

  

以一种方式允许它并在另一种方式中禁止它的动机是什么?

这对ECMA国际的作家来说是件好事。

String() ES6 Spec

+ operator runtime evaluation ES6 Spec

ToString() Output behavior ES6 Spec