1 回答
TA贡献1829条经验 获得超13个赞
首先请注意,您的定义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 )进行调用:this
var sow = Object(Symbol()); console.log(sow.toString === Symbol.prototype.toString);
这有点不同。Symbol.prototype.toString从对象中检索底层 Symbol,然后使用 Symbol 调用SymbolDescriptiveString,从而生成一个带有符号描述值(如果有)的字符串。
请注意,未包装在对象中的本机 Symbol在传递给时不会String
抛出,因为当参数是符号时,String 构造函数不会调用有问题的抽象方法。ToString
const sym = Symbol(); console.log(String(sym)); console.log(sym.toString());
添加回答
举报