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

Javascript 尝试将符号包装器对象显式转换为字符串时出错,javascript,language-lawyer,Javascript,Language Lawyer,我在firefox web控制台中尝试了以下操作 var sow=(函数(){返回此;}).call(Symbol()); console.log(类型(sow));//对象 console.log(sow.toString());//作品:Symbol() 字符串(sow);//不起作用:抛出“TypeError:无法将符号转换为字符串”首先请注意,您对sow的定义可以简化为: var sow = Object(Symbol()); 在草率模式下,它与您的代码执行相同的操作 当您使用参数v

我在firefox web控制台中尝试了以下操作

var sow=(函数(){返回此;}).call(Symbol());
console.log(类型(sow));//对象
console.log(sow.toString());//作品:Symbol()

字符串(sow);//不起作用:抛出“TypeError:无法将符号转换为字符串”
首先请注意,您对
sow
的定义可以简化为:

var sow = Object(Symbol());
在草率模式下,它与您的代码执行相同的操作

当您使用参数
value
调用
String
时,根据:

a。如果NewTarget未定义且类型(值)为Symbol,则返回SymbolDescriptiveString(值)

b。就这样吧?ToString(值)

在这里,由于您已将符号包装在对象中,因此其类型不是符号;相反,它是一个对象,因此调用
ToString
。调用此函数时,将首先将对象强制为原语,然后对其调用
ToString

  • 让我来吧?TopPrimitive(参数、提示字符串)
  • 返回?ToString(primValue)
  • 但是符号不能调用
    ToString
    ;正如您在同一个表中看到的,当传递一个符号时,
    ToString
    将抛出一个TypeError

    这就是为什么
    String(sow)工作。相反,当您执行
    sow.toString()
    时,您使用对象包装符号的调用上下文(a
    this
    )调用
    Symbol.prototype.toString

    var-sow=Object(Symbol());
    
    log(sow.toString==Symbol.prototype.toString)这是否回答了您的问题?