8

Как лучше всего преобразовать число в строку в JavaScript?

32

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

Вот несколько примеров:

  1. String(n)

  2. n.toString()

  3. "" + n

  4. n + ""

Какой из этих методов является наиболее эффективным, и есть ли какие-либо другие альтернативы, которые стоит рассмотреть?

5 ответ(ов)

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

На самом деле, хотя я обычно делаю это для простоты, за тысячи итераций оказывается, что по сырой скорости есть преимущество у метода .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.

5

На мой взгляд, n.toString() выигрывает по ясности, и я не думаю, что это несет дополнительные затраты.

1

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

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

0

Самый простой способ преобразовать любую переменную в строку — это сложить её с пустой строкой.

Например:

5.41 + ''    // Результат: строка '5.41'
Math.PI + '' // Результат: строка '3.141592653589793'

Этот подход работает для всех типов данных в JavaScript, приводя их к строковому типу.

0

Вот перевод вашего запроса на русский язык в формате ответа на StackOverflow:


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

Тест в Node.js 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

Как видно из результатов, наиболее быстрые методы конкатенации строк – это test1.1, test1.3 и test4, в то время как методы, использующие .toString(), значительно медленнее. Если у вас есть дополнительные вопросы или вы хотите обсудить результаты подробнее, дайте знать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь