Кастинг для строки в JavaScript
Я нашел три способа переноса переменной в String
в JavaScript.
Я искал эти три параметра в исходном коде jQuery и все они используются.
Я хотел бы знать, есть ли между ними различия:
value.toString()
String(value)
value + ""
DEMO
Все они производят один и тот же результат, но один из них лучше других?
Я бы сказал, что + ""
имеет преимущество в том, что он сохраняет некоторые символы, но это не то преимущество, что-нибудь еще?
Ответы
Ответ 1
Они ведут себя по-разному, когда value
null
.
-
null.toString()
выдает ошибку - не удается вызвать метод 'toString' из null
-
String(null)
возвращает - "null"
-
null + ""
также возвращает - "null"
Очень похожее поведение происходит, если value
- undefined
(см. ответ jbabey).
Кроме этого, существует незначительная разница в производительности, которая, если вы не используете их в огромных циклах, не стоит беспокоиться.
Ответ 2
Существуют различия, но они, вероятно, не имеют отношения к вашему вопросу. Например, прототип toString не существует в переменных undefined, но вы можете использовать undefined для строки, используя два других метода:
var foo;
var myString1 = String(foo); // "undefined" as a string
var myString2 = foo + ''; // "undefined" as a string
var myString3 = foo.toString(); // throws an exception
http://jsfiddle.net/f8YwA/
Ответ 3
Они ведут себя одинаково, но toString
также предоставляет способ преобразования числовых двоичных, восьмеричных или шестнадцатеричных строк:
Пример:
var a = (50274).toString(16) // "c462"
var b = (76).toString(8) // "114"
var c = (7623).toString(36) // "5vr"
var d = (100).toString(2) // "1100100"
Ответ 4
Согласно этот тест JSPerf, они отличаются скоростью. Но если вы не собираетесь использовать их в огромных количествах, любой из них должен хорошо работать.
Для полноты: Как уже упоминалось asawyer, вы также можете использовать метод .toString()
.
Ответ 5
если вы в порядке с нулевым значением, undefined, NaN, 0 и false, все литье в '', а затем (s ? s+'' : '')
выполняется быстрее.
см. http://jsperf.com/cast-to-string/8
Примечание. В настоящее время в браузерах есть значительные различия.
Ответ 6
В дополнение ко всему вышесказанному следует отметить, что для определенного значения v
:
-
String(v)
вызывает v.toString()
-
'' + v
вызывает v.valueOf()
перед любым другим типом
Итак, мы могли бы сделать что-то вроде:
var mixin = {
valueOf: function () { return false },
toString: function () { return 'true' }
};
mixin === false; // false
mixin == false; // true
'' + mixin; // "false"
String(mixin) // "true"
Протестировано в FF 34.0 и Node 0.10
Ответ 7
Пример реального мира: у меня есть функция журнала, которую можно вызвать с произвольным количеством параметров: log("foo is {} and bar is {}", param1, param2)
. Если флаг DEBUG
установлен на true
, скобки заменяются заданными параметрами, а строка передается на console.log(msg)
. Параметры могут и будут содержать строки, числа и все, что может быть возвращено вызовами JSON/AJAX, возможно даже null
.
-
arguments[i].toString()
не является опцией из-за возможных значений null
(см. ответ Коннелла Уоткинса)
- JSLint будет жаловаться на
arguments[i] + ""
. Это может повлиять или не повлиять на решение о том, что использовать. Некоторые люди строго придерживаются JSLint.
- В некоторых браузерах конкатенирование пустых строк выполняется немного быстрее, чем использование строковой функции или конструктора строк (см. тест JSPerf в ответе Sammys S.). В Opera 12 и Firefox 19 конкатенирование пустых строк выполняется значительно быстрее (95% в Firefox 19) - или, по крайней мере, JSPerf говорит так.
Ответ 8
На этой странице вы можете проверить производительность каждого метода самостоятельно:)
http://jsperf.com/cast-to-string/2
здесь, на всех машинах и браузерах, "" "+ str" является самым быстрым, (String) str является самым медленным