2015-10-04 7 views
1

в то время как я понимаю, что символ не может быть автоматически/беззвучно преобразуются в строки (см «преобразования типа 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: хотя кажется, что это обычный объект, может быть, это не так?

спасибо.

ответ

1

Это потому, что Symbol.prototype не является Symbol и не имеет внутреннего разъема [[SymbolData]].

19.4.3 Свойства объекта-прототипа Symbol

Символ Объект прототипа является характеристическая объект% SymbolPrototype%. Объект прототипа Symbol является обычным объектом. Это не экземпляр Symbol и не имеет внутреннего слота [[SymbolData]].

Поскольку это не символ и не имеет [[SymbolData]] внутренний слот будет сбой на этапе 3b) функции Symbol.prototype.toString.

Если s не имеет внутреннего слота [[SymbolData]], введите исключение TypeError.

+0

Но метод ToString вызывается на прототипе (обычный объект), а не на экземпляр символа –

+0

@JuanMendes, 'toString' является свойством объекта-прототипа, поэтому он не будет выглядеть в цепи прототипов для 'Object.prototype.toString'. – MinusFour

Смежные вопросы