符号原型的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。