Приведение символьных строк
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.