Кастинг для строки в 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 является самым медленным