Каков наилучший способ преобразования числа в строку в JavaScript?

каков "лучший" способ преобразования числа в строку (с точки зрения преимущества скорости, преимущества ясности, преимущества памяти и т. д.) ?

примеры:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

19 ответов


такой:

var foo = 45;
var bar = '' + foo;

на самом деле, хотя я обычно делаю это так для простого удобства, более 1000 с итераций кажется для сырой скорости есть преимущество для .toString()

см. тесты производительности здесь (не мной, но нашел, когда я пошел писать свой собственный): http://jsben.ch/#/ghQYR

самый быстрый на основе теста JSPerf выше:str = num.toString();

стоит отметить что разница в скорости не слишком существенна, если учесть, что она может сделать преобразование любым способом 1 миллион раз за 0,1 секунды.

обновление: скорость, кажется, сильно отличается от браузера. В Chrome num + '' кажется, самый быстрый на основе этого теста http://jsben.ch/#/ghQYR

обновление 2: снова на основе моего теста выше следует отметить, что Firefox 20.0.1 выполняет .toString() около 100 раз медленнее чем '' + num образец.


по-моему n.toString() принимает приз за его ясность, и я не думаю, что он несет какие-либо дополнительные накладные расходы.


явные преобразования очень понятны для кого-то, кто новичок в языке. Использование принуждения типа, как предлагали другие, приводит к двусмысленности, если разработчик не знает правил принуждения. В конечном счете время разработчика дороже, чем время процессора, поэтому я бы оптимизировал для первого за счет последнего. Тем не менее, в этом случае разница, вероятно, незначительна, но если нет, я уверен, что есть некоторые приличные компрессоры JavaScript, которые оптимизируют этот вид вещь.

Итак, по вышеуказанным причинам я бы пошел с:n.toString() или String(n). String(n), вероятно, лучший выбор, потому что он не потерпит неудачу, если n имеет значение null или undefined.


2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

источник


самый простой способ преобразовать любую переменную в строку-добавить пустую строку в эту переменную.

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

язык-в-щеку очевидно:

var harshNum = 108;
"".split.call(harshNum,"").join("");

или в ES6 вы можете просто использовать шаблон строки:

var harshNum = 108;
`${harshNum}`;

Если вам нужно, чтобы


мне нравятся первые два, так как их легче читать. Я склонен использовать String(n) но это просто вопрос стиля, чем что-либо еще.

то есть, если у вас нет строки

var n = 5;
console.log ("the number is: " + n);

что очень понятны


Я думаю, что это зависит от ситуации, но в любом случае вы можете использовать .toString() метод, как это очень ясно понять.


другие ответы уже охватывает и другие варианты, но я предпочитаю этот:

s = `${n}`

короткий, краткий, уже используемый во многих других местах (если вы используете современную версию framework / ES), поэтому можно с уверенностью сказать, что любой программист поймет это.

Не то, чтобы это (обычно) имеет большое значение, но это также кажется среди самых быстрых по сравнению с другие способы.


Если бы я должен был принять все во внимание, я предложу следующее

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

IMHO, это самый быстрый способ преобразования в строку. Поправьте меня, если я ошибаюсь.


Если вам интересно, какой из них является наиболее эффективным, проверьте это, где я сравниваю все различные преобразования Number - > String.

выглядит так:2+'' или 2+"" самый быстрый.

https://jsperf.com/int-2-string


мы также можем использовать строка конструктор. Согласно этот тест Это самый быстрый способ преобразовать число в строку в Firefox 58 даже если это медленнее, чем " + num в популярном браузере Google Chrome.


метод toFixed() также решает цель.

var n = 8.434332;
n.toFixed(2)  // 8.43

можно назвать


просто столкнулся с этим недавно, метод 3 и 4 не подходят, потому что, как строки копируются, а затем объединяются. Для небольшой программы эта проблема незначительна, но для любого реального веб-приложения это действие, где мы имеем дело с частотными манипуляциями строк, может повлиять на производительность и читаемость.

вот ссылка на чтение.


Я собираюсь изменить это с большим количеством данных, когда у меня есть время, сейчас это нормально...

тест в nodejs v8.11.2: 2018/06/06

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

выход

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms

похоже, что аналогичные результаты при использовании node.js. Я запустил этот скрипт:

let bar;
let foo = ["45","foo"];

console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo;
}
console.timeEnd('string concat testing');


console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
    bar = String(foo);
}
console.timeEnd("string obj testing");

console.time("string both");
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo + "";
}
console.timeEnd("string both");

и получил следующие результаты:

❯ node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

похожие времена каждый раз, когда я запускал его.


Я https://jsperf.com создать тестовый случай для следующих случаев:

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-string-conversion-speed-comparison

по состоянию на 24 июля 2018 года результаты говорят, что number + '' является самым быстрым в Chrome, в Firefox, который связан с литералами строк шаблона.

и String(number) и number.toString() - около 95% медленнее, чем самый быстрый вариант.

performance tests, description above