1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個贊
首先請注意,您的定義sow
可以簡化為:
var sow = Object(Symbol());
在草率模式下,它與您的代碼執(zhí)行相同的操作。
當(dāng)您String
使用參數(shù)調(diào)用時value
,根據(jù)規(guī)范:
一種。如果 NewTarget 未定義且 Type(value) 為 Symbol,則返回 SymbolDescriptiveString(value)。
灣。讓我們成為?ToString(值)。
在這里,由于您將符號包裝在對象中,因此它的類型不是符號;相反,它是一個對象,因此ToString
被稱為。這在使用 object調(diào)用時,將首先將對象強(qiáng)制為原語,然后調(diào)用ToString
它:
讓 primValue 成為 ? ToPrimitive(參數(shù),提示字符串)。
返回 ?ToString(原始值)。
但是符號不能ToString
召喚它們;正如您在同一張表中看到的那樣,當(dāng)傳遞一個符號時,ToString
將拋出一個 TypeError。
這就是為什么String(sow);
有效。相反,當(dāng)您這樣做時sow.toString()
,您正在使用對象包裝符號Symbol.prototype.toString
的調(diào)用上下文(a )進(jìn)行調(diào)用:this
var sow = Object(Symbol()); console.log(sow.toString === Symbol.prototype.toString);
這有點(diǎn)不同。Symbol.prototype.toString從對象中檢索底層 Symbol,然后使用 Symbol 調(diào)用SymbolDescriptiveString,從而生成一個帶有符號描述值(如果有)的字符串。
請注意,未包裝在對象中的本機(jī) Symbol在傳遞給時不會String
拋出,因?yàn)楫?dāng)參數(shù)是符號時,String 構(gòu)造函數(shù)不會調(diào)用有問題的抽象方法。ToString
const sym = Symbol(); console.log(String(sym)); console.log(sym.toString());
添加回答
舉報