符号:隐式字符串转换如何在JavaScript中工作?

Pat*_*rts 8 javascript type-conversion ecmascript-6

阅读SymbolJavaScript中的文档,并在几个环境(Chrome,Firefox,Node.js)中进行测试,我意识到我对隐式字符串转换的理解是有缺陷的.

我总是认为toString()在尝试转换为字符串时调用了对象的方法,并且如果该函数没有返回基元,那么它调用了对象的toPrimitive()方法,如果这不起作用,则会输入错误.但是,这个解释无法涵盖TypeError那个Symbol:

var sym = Symbol("test");

try {
  console.log(sym + "ing");
} catch (error) {
  console.error(error);
}
Run Code Online (Sandbox Code Playgroud)

TypeError: Cannot convert a Symbol value to a string
Run Code Online (Sandbox Code Playgroud)

但很明显,Symbols有一个有效的toString()方法.那为什么不叫呢?

Mik*_*uck 5

toString在进行隐式字符串转换时,调用对象方法是正确的.但是,正如规范所述,符号上的隐式字符串转换会导致a TypeError.

正如Axel Rauschmayer博士所说:

鉴于字符串和符号都可以是属性键,您希望保护人们不会意外地将符号转换为字符串.

  • @PatrickRoberts简单的答案是"因为规范是这么说的".真正的答案是引擎实现者必须遵循规范,因此他们在内部实现一些东西,检查字符串类型转换中是否涉及`Symbol`然后抛出异常.`Symbol`本身不处理这种行为. (2认同)