尝试将符号包装对象显式转换为字符串时出错

我在 Firefox Web 控制台中尝试了以下操作。


    var sow = (function(){ return this; }).call(Symbol());


    console.log(typeof (sow)); // object


    console.log(sow.toString()); // Works: Symbol()


    String(sow); // Does not work: Throws "TypeError: can't convert symbol to string"

由于某种奇怪的原因,最后一条语句中的显式转换不起作用(引发错误)。


为什么会这样?


请注意,它sow是一个对象,并且toString它的原型链中有一个返回字符串的函数,因此它应该通过使用该函数来工作。


猛跑小猪
浏览 134回答 1
1回答

烙印99

首先请注意,您的定义sow可以简化为:var sow = Object(Symbol());在草率模式下,它与您的代码执行相同的操作。当您String使用参数调用时value,根据规范:一种。如果 NewTarget 未定义且 Type(value) 为 Symbol,则返回 SymbolDescriptiveString(value)。湾。让我们成为?ToString(值)。在这里,由于您将符号包装在对象中,因此它的类型不是符号;相反,它是一个对象,因此ToString被称为。这在使用 object调用时,将首先将对象强制为原语,然后调用ToString它:让 primValue 成为 ? ToPrimitive(参数,提示字符串)。返回 ?ToString(原始值)。但是符号不能ToString召唤它们;正如您在同一张表中看到的那样,当传递一个符号时,ToString将抛出一个 TypeError。这就是为什么String(sow);有效。相反,当您这样做时sow.toString(),您正在使用对象包装符号Symbol.prototype.toString的调用上下文(a )进行调用:thisvar sow = Object(Symbol());  console.log(sow.toString === Symbol.prototype.toString);这有点不同。Symbol.prototype.toString从对象中检索底层 Symbol,然后使用 Symbol 调用SymbolDescriptiveString,从而生成一个带有符号描述值(如果有)的字符串。请注意,未包装在对象中的本机 Symbol在传递给时不会String抛出,因为当参数是符号时,String 构造函数不会调用有问题的抽象方法。ToStringconst sym = Symbol();  console.log(String(sym));  console.log(sym.toString());
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript