Ответы:
нравится:
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".