В JavaScript есть три основных способа, которыми любое значение может быть преобразовано в строку. Этот пост в блоге объясняет каждый путь, а также его преимущества и недостатки.
Три подхода для преобразования в строку
Три подхода для преобразования в строку:
- value.toString ()
- «» + значение
- Строковое значение)
Проблема с подходом № 1 состоит в том, что он не работает, если значение равно нулю или не определено. Это оставляет нам подходы № 2 и № 3, которые в основном эквивалентны.
- «» + значение: оператор плюс подходит для преобразования значения, когда оно окружено непустыми строками. В качестве способа преобразования значения в строку я нахожу его менее описательным для своих намерений. Но это дело вкуса, некоторые люди предпочитают такой подход к String (значение).
- String (value): этот подход довольно явный: примените функцию String () к значению. Единственная проблема состоит в том, что этот вызов функции сбивает с толку некоторых людей, особенно тех, кто приходит из Java, потому что String также является конструктором. Однако функция и конструктор дают совершенно разные результаты:
> String("abc") === new String("abc") false > typeof String("abc") 'string' > String("abc") instanceof String false > typeof new String("abc") 'object' > new String("abc") instanceof String trueФункция выдает, как и было обещано, строку ( примитив [1] ). Конструктор создает экземпляр типа String (объект). Последнее вряд ли когда-либо пригодится в JavaScript, поэтому обычно вы можете забыть о String как о конструкторе и сосредоточиться на его роли в преобразовании в строку.
Незначительная разница между «» + value и String (value)
До сих пор вы слышали, что + и String () преобразуют свои «аргументы» в строку. Но как они на самом деле это делают? Оказывается, они делают это немного по-разному, но обычно получают один и тот же результат.
Преобразование примитивов в строку
Оба подхода используют внутреннюю операцию ToString () для преобразования примитивов в строку. «Внутренний» означает: функцию, указанную в ECMAScript 5.1 (§9.8), которая недоступна для самого языка. В следующей таблице объясняется, как ToString () работает с примитивами.
| аргументация | Результат |
| не определено | «Неопределенный» |
| ноль | «ноль» |
| логическое значение | либо «правда», либо «ложь» |
| числовое значение | число в виде строки, например «1.765» |
| строковое значение | нет необходимости в преобразовании |
Преобразование объектов в строку
Оба подхода сначала преобразуют объект в примитив, а затем преобразуют этот примитив в строку. Однако + использует внутренний оператор ToNumber () (за исключением дат
[2] ), в то время как String () использует ToString ().
- ToNumber (): чтобы преобразовать объект obj в примитив, вызовите obj.valueOf (). Если результат примитивный, верните этот результат. В противном случае, вызовите obj.toString (). Если результат примитивный, верните этот результат. В противном случае выведите ошибку TypeError.
- ToString (): работает так же, но вызывает obj.toString () перед obj.valueOf ().
С помощью следующего объекта вы можете наблюдать разницу:
var obj = {
valueOf: function () {
console.log("valueOf");
return {}; // not a primitive, keep going
},
toString: function () {
console.log("toString");
return {}; // not a primitive, keep going
}
};
Взаимодействие:
> "" + obj
valueOf
toString
TypeError: Cannot convert object to primitive value
> String(obj)
toString
valueOf
TypeError: Cannot convert object to primitive value
Большинство объектов используют реализацию по умолчанию valueOf (), которая возвращает это для объектов. Следовательно, этот метод всегда будет пропущен ToNumber ().
> var x = {}
> x.valueOf() === x
true
Экземпляры булевых, Number и String примитивов обертки и valueOf возвращают обернутый примитив. Но это все еще означает, что конечный результат будет таким же, как и для toString (), даже если он будет получен другим способом.
> var n = new Number(756)
> n.valueOf() === n
false
> n.valueOf() === 756
true
Вывод
Какой из трех подходов для преобразования в строку вы должны выбрать? value.toString () может быть в порядке, если вы уверены, что значение никогда не будет нулевым или неопределенным. В противном случае, «» + value и String (value) в основном эквивалентны. То, что люди предпочитают, зависит от вкуса. Я считаю String (значение) более явным.
Похожие сообщения
- Значения JavaScript: не все является объектом [примитивы против объектов]
- Что такое {} + {} в JavaScript? [объясняет, как работает оператор +]
- Конкатенация строк в JavaScript [как лучше конкатенировать много строк]