Приведение символьных строк

Symbol() + '' бросает

Ошибка типа: невозможно преобразовать значение символа в строку

В то время как известный обходной путь заключается в использовании String(Symbol()),

Это выглядит несовместимым с другими примитивами, включая те, которые почти никогда не должны принуждаться (undefined а также null).

Как именно String отличаться от + '' (кроме как работает)? Спецификации явно указывают, что String должны принимать символы? Каковы были мотивы, чтобы позволить это одним способом и запретить другим?

1 ответ

Решение

Чем именно String отличается от + '' (кроме того, что он работает)? Спецификации явно указывают, что String должен принимать символы?

Они отличаются тем, что String() есть случай для Symbol()тогда как + оператор (при использовании для объединения) напрямую вызывает ToString() операция, которая бросает TypeError исключение для Symbol(),

От String() спецификация:

Если NewTarget не определен и Type (значение) равно Symbol, вернуть SymbolDescriptiveString (значение).

От + оценка спецификации:

Если Тип (lprim) является Строкой или Тип (rprim) является Строкой, то

  • Пусть lstr будет ToString (lprim).
    • ReturnIfAbrupt (LSTR).
    • Пусть rstr будет ToString (rprim).
    • ReturnIfAbrupt (RSTR).
    • Вернуть строку, которая является результатом объединения lstr и rstr.

Примечание: определения для lprim а также rprim исходить из 10 предыдущих шагов в процессе оценки, которые включают в себя получение примитивных типов и значений сторон выражения. Я не включил их, чтобы сделать этот пост короче. Я связал каждую спецификацию, на которую я ссылался ниже.

От ToString() выход:

Символ: бросить исключение TypeError.

Что касается вашего последнего вопроса:

Каковы были мотивы, чтобы позволить это одним способом и запретить другим?

Это что-то для авторов в ECMA International.

Строка () ES6 Spec

+ оценка времени выполнения оператора ES6 Spec

ToString () Выходное поведение ES6 Spec

Другие вопросы по тегам