в то время как я понимаю, что символ не может быть автоматически/беззвучно преобразуются в строки (см «преобразования типа Symbol» на here):Строковое представление прототипа Symbol?
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
я удивлен/запутано, что пытается получить строковое представление символа прототип бросает исключение, то ли с помощью преобразования автоматического Струнный, явно вызывая .toString
или с помощью "safer" String(sym) conversion:
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]
так как символ» s, похоже, просто является объектом, почему бы не создать его строковое представление?
я нашел что-то подобное в этом post, который ссылается на то, что, кажется, ES6/2015 spec regarding converting Symbols to Strings, но опять же я запутался, почему это было бы предотвратить прототип символ, которая, кажется, объект, от превращения в строку.
также, Node.js's util.inspect
выведет строковое представление прототипа Symbol, хотя мне еще предстоит выяснить, как/почему из-за просмотра source.
Наконец-то, похоже, что я пропустил что-то основное о прототипе Symbol: хотя кажется, что это обычный объект, может быть, это не так?
спасибо.
Но метод ToString вызывается на прототипе (обычный объект), а не на экземпляр символа –
@JuanMendes, 'toString' является свойством объекта-прототипа, поэтому он не будет выглядеть в цепи прототипов для 'Object.prototype.toString'. – MinusFour