Какой лучший способ преобразовать число в строку в JavaScript? - PullRequest
449 голосов
/ 23 апреля 2011

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

Некоторые примеры:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

Ответы [ 21 ]

2 голосов
/ 24 января 2019

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

2 голосов
/ 24 июля 2018

Я использовал 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

1 голос
/ 15 декабря 2018

Единственное действительное решение для почти всех возможных существующих и будущих случаев (входные данные являются числом, нулем, неопределенным, символом, чем-либо еще) - String(x). Не используйте 3 способа для простой операции, основываясь на предположениях типа значения, таких как «здесь я определенно преобразую число в строку и здесь определенно логическое значение в строку».

Пояснение:

String(x) обрабатывает нули, неопределенные символы, [что угодно] и вызывает .toString() для объектов.

'' + x вызовы .valueOf() на x (приведение к номеру), броски на символы, могут обеспечить результаты, зависящие от реализации.

x.toString() бросает в ноль и неопределенный.

Примечание: String(x) по-прежнему не будет работать на объектах без прототипов, таких как Object.create(null).

Если вам не нравятся строки типа «Hello, undefined» или вы хотите поддерживать объекты без прототипов, используйте следующую функцию преобразования типов:

/**
 * Safely casts any value to string. Null and undefined are converted to ''.
 * @param  {*} value
 * @return {string}
 */
function string (str) {
  return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}
1 голос
/ 23 апреля 2011

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

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

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

0 голосов
/ 04 августа 2017

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

Похоже, 2+'' или 2+"" самые быстрые.

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

0 голосов
/ 10 июля 2018

Похоже, аналогичные результаты при использовании 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

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

0 голосов
/ 07 июня 2018

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

Тест в 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
0 голосов
/ 06 апреля 2018

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

Вот ссылка для чтения .

0 голосов
/ 30 марта 2018

Вы можете вызвать Number объект и затем вызвать toString().

Number.call(null, n).toString()

Вы можете использовать этот трюк для других нативных объектов javascript.

0 голосов
/ 14 марта 2018

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

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