Ответы:
нравится:
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
образец.
null foo
что не выдает ошибку.
По моему мнению, n.toString()
приз за его ясность, и я не думаю, что это несет какие-либо дополнительные издержки.
null
, undefined
), которые не работают с этим ответом, вряд ли делает его «небезопасным».
null
или undefined
как это зависит от конкретного приложения, хотя я представляю (n || defaultNumber).toString()
, что большинство людей хотели бы в такой ситуации, я категорически не согласен, мы должны работать над всеми вопросами. Речь шла о преобразовании чисел в строки, хорошей архитектуре и других преобразованиях типов, где это необходимо, это отдельные уроки.
Явные преобразования очень понятны для тех, кто плохо знаком с языком. Использование принуждения типов, как предлагали другие, приводит к неоднозначности, если разработчик не осведомлен о правилах принуждения. В конечном счете, время разработки обходится дороже, чем процессорного времени, поэтому я бы оптимизировал для первого за счет последнего. Тем не менее, в этом случае разница, вероятно, незначительна, но если нет, я уверен, что есть несколько достойных JavaScript-компрессоров, которые оптимизируют подобные вещи.
Итак, по вышеуказанным причинам я бы пошел с: n.toString()
или String(n)
. String(n)
Вероятно, это лучший выбор, потому что он не потерпит неудачу, если n
равен нулю или не определен.
null
, или undefined
. Если n
это null
или undefined
из-за ошибки в моей программе, то я бы предпочел, чтобы моя программа не работала в этом состоянии, чтобы дать мне больше шансов найти и исправить ошибку. Сбои программы - это подарки для программиста, чтобы помочь ей найти ошибки :-). Альтернативой является поставка программного обеспечения, которое не работает, как задумано, тщательно скрывая ошибки. Итак, я не фанат использования String(n)
для маскировки ошибки.
String(n)
подходит для использования в функциональном стиле, например, с комбайном подчеркивания _.compose(funcThatNeedsAStringParam, String)
.
... Синтаксический анализатор JavaScript пытается проанализировать точечную запись числа как литерал с плавающей точкой.
2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first
Язык в щеке очевидно:
var harshNum = 108;
"".split.call(harshNum,"").join("");
Или в ES6 вы можете просто использовать строки шаблона :
var harshNum = 108;
`${harshNum}`;
'' + number
метод. Тем не менее, результаты этих тестов сильно различаются при их многократном выполнении, поэтому не уверен, следует ли принимать их слишком серьезно.
Другие ответы уже охватывали другие варианты, но я предпочитаю этот:
s = `${n}`
Короткий, лаконичный, уже используемый во многих других местах (если вы используете современную платформу / версию ES), так что это безопасная ставка, любой программист поймет это.
Не то, чтобы это (обычно) имело большое значение, но оно также оказалось одним из самых быстрых по сравнению с другими методами .
n.toString()
, не так ли?
n
это undefined
будет бросать синтаксическую ошибку, используя.toString()
String(n)
во всех случаях? Разница лишь в том, что это менее понятно.
Самый простой способ преобразовать любую переменную в строку - добавить пустую строку в эту переменную.
5.41 + '' // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'
(5.41 + '')
использовать методы String, такие как .substring()
и другие
Если вам нужно отформатировать результат в определенном количестве десятичных знаков, например, для представления валюты, вам нужно что-то вроде toFixed()
метода.
number.toFixed( [digits] )
digits
количество цифр, отображаемых после запятой.
Я использовал 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% медленнее, чем самый быстрый вариант.
Единственное допустимое решение для почти всех возможных существующих и будущих случаев (входные данные - число, ноль, неопределенное значение, символ и все остальное) String(x)
. Не используйте 3 способа для простой операции, основываясь на предположениях типа значения, таких как «здесь я определенно преобразую число в строку и здесь определенно логическое значение в строку».
Объяснение:
String(x)
обрабатывает null, undefined, Symbols, [что угодно] и вызывает .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));
}
С помощью числовых литералов точка для доступа к свойству должна отличаться от десятичной точки. Это оставляет вам следующие опции, если вы хотите вызвать String () для числового литерала 123:
123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()
Ниже приведены методы для преобразования целого числа в строку в JS
Методы расположены в порядке убывания производительности.
(Результаты теста производительности приведены @DarckBlezzer в своем ответе)
var num = 1
Способ 1:
num = `$ {num}`
Способ 2:
num = num + ''
Способ 3:
num = String (num)
Способ 4:
num = num.toString ()
Примечание: вы не можете напрямую вызвать tostring () с номера
Например: 2.toString () сгенерирует Uncaught SyntaxError : неверный или неожиданный токен
Если вам интересно, какой из них наиболее эффективен, проверьте это, где я сравниваю все различные преобразования числа -> строки.
Похоже 2+''
или 2+""
самые быстрые.
Мы также можем использовать конструктор String . Согласно этому тесту, это самый быстрый способ конвертировать Number в 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
Подобные времена каждый раз, когда я запускал его.
'' + 123e-50
возврат"1.23e-48"
.