为什么隐式符号到字符串转换';导致JavaScript中的类型错误?

为什么隐式符号到字符串转换';导致JavaScript中的类型错误?,javascript,ecmascript-6,symbols,Javascript,Ecmascript 6,Symbols,ES6中的Symbol上有一个.toString(),它返回Symbol的字符串表示形式,但是想知道为什么''+Symbol()不起作用(运行此表达式会抛出类型错误,我不希望如此)?后者只是在一个新的符号上调用.toString(),并将其附加(+)到空字符串吗?来自 符号对象覆盖对象的toString方法; 它不继承Object.prototype.toString()。对于符号对象, toString方法返回对象的字符串表示形式 后者只是在新的符号上调用.toString(),并将其附加到空

ES6中的
Symbol
上有一个
.toString()
,它返回
Symbol
的字符串表示形式,但是想知道为什么
''+Symbol()
不起作用(运行此表达式会抛出
类型错误,我不希望如此)?后者只是在一个新的
符号上调用
.toString()
,并将其附加(
+
)到空字符串吗?

来自

符号对象覆盖对象的toString方法; 它不继承Object.prototype.toString()。对于符号对象, toString方法返回对象的字符串表示形式

后者只是在新的
符号上调用
.toString()
,并将其附加到空字符串中吗

不,实际上,符号不能隐式转换为字符串或数字,尽管有趣的是,您可以将它们隐式转换为布尔值

关于其中一些陷阱:

符号类型转换

使用符号的类型转换时需要注意的一些事项

  • 尝试将符号转换为数字时,将抛出
    TypeError
    (例如
    +sym
    sym | 0
  • 使用松散相等时,
    Object(sym)==sym
    返回
    true。
  • Symbol(“foo”)+“bar”
    抛出一个
    TypeError
    (无法将符号转换为字符串)。例如,这可以防止您通过符号以静默方式创建新的字符串属性名称
  • “safe”
    String(sym)
    转换的工作原理类似于调用带有符号的
    Symbol.prototype.toString()
    ,但请注意
    新字符串(sym)
    将抛出

此行为记录在规范中的以下文件中:

参数类型:符号

结果:抛出一个
TypeError
异常

同样,对于:

参数类型:符号

结果:抛出一个
TypeError
异常


若要将
符号
强制转换为没有
类型错误的字符串
,您必须使用
toString
方法,或
string()

@Dai
'+123
作为隐式类型转换,但为什么
'+Symbol()
甚至被视为隐式转换都不起作用?对不起,我误解了您的问题。你到底看到了什么行为?您是否收到了
类型错误
或其他问题?@Dai,很抱歉这个问题造成了混乱。稍微修改一下。我看到
''+Symbol()
抛出TypeError,想知道为什么它会这样做,因为
Symbol().toString()
有效。当我尝试Symbol()。\uuuuu proto\uuuuuuuu.toString()时,它抛出了一个错误,也许它可以帮助理解这一点。。。(我不知道答案。)相关:隐式将对象强制转换为字符串是否意味着对对象调用
object.prototype.toString()
?@Thomson是的,将对象隐式转换为字符串将调用
toString
方法,无论是对实例本身(如果已设置)还是从原型调用。如您所述,隐式转换
Symbol
String
应该会成功,因为
Symbol
实例(
Symbol()
)上有一个可行的
toString()
)?@Thomson-Symbol实际上不是对象的,而是原语,它们被明确设计为抛出
TypeError
,而不是隐式调用
toString
方法。@AlexanderO'Mara,他在问当您执行symbol.toString()时是否会发生意外装箱?还是应该使用字符串(符号)来防止装箱?这并不能回答问题,这就是为什么
''+symbol
不起作用的原因。