符号原型的string表示?

而我意识到Symbol的不能自动/无声地转换为string(请参阅这里的 “符号types转换”):

s = Symbol('s'); typeof s; // -> 'symbol' s; // -> 'Symbol (s)' s.toString(); // -> 'Symbol (s)' using Symbol.prototype.toString() String(s); // -> 'Symbol (s)' using safe String(s) conversion s +''; // throws 'TypeError: Cannot convert a Symbol value to a string' as expected 

我很惊讶/困惑,试图获取一个符号的原型的string表示会引发exception,无论是使用自动string转换,显式调用.toString或使用“安全”string(sym)转换 :

 s = Symbol('s'); typeof s; // -> 'symbol' p = Object.getPrototypeOf(s); // -> Symbol {} typeof p; // -> 'object' p+''; // -> TypeError: Method Symbol.prototype.valueOf called on incompatible receiver [object Object] p.toString(); // -> TypeError: Method Symbol.prototype.toString called on incompatible receiver [object Object] String(p); // -> TypeError: Method Symbol.prototype.toString called on incompatible receiver [object Object] 

因为一个Symbol的原型似乎只是一个Object,为什么不能创build一个String的表示呢?

我在这篇文章中发现了一些类似的东西,它引用了关于将符号转换为string的ES6 / 2015规范 ,但是我又很困惑,为什么这会阻止一个符号的原型,它似乎是Object,被转换为串。

另外,Node.js的util.inspect将会输出一个Symbol原型的string表示,但是我还没有弄清楚为什么要仔细阅读源代码 。

最后,它似乎只是丢失了一个符号的原型的基本知识:虽然它看起来像一个普通的对象,也许它不是?

谢谢。

这是因为Symbol.prototype不是一个Symbol也没有内部[[SymbolData]]槽。

19.4.3符号原型对象的属性

符号原型对象是内部对象%SymbolPrototype%。 符号原型对象是一个普通的对象。 它不是符号实例,没有[[SymbolData]]内部插槽。

由于它不是符号,并且没有[[SymbolData]]内部插槽,它将在Symbol.prototype.toString函数的步骤3b)失败。

如果s没有[[SymbolData]]内部插槽,则引发TypeErrorexception。