Відповіді:
подобається це:
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-compitation
Станом на 24 липня 2018 року результати свідчать про те number + '', що найшвидший у Chrome, у Firefox, який зв’язується з літеральними рядками шаблону.
І те String(number), і number.toString()на 95% повільніше, ніж найшвидший варіант.
Єдиним дійсним рішенням для майже всіх можливих існуючих та майбутніх випадків (вхід є числом, нульовим, невизначеним, символом, будь-яким іншим) String(x). Не використовуйте 3 способи простої операції, грунтуючись на припущеннях типу значень, як-от "тут я конвертую безумовно число в рядок і тут, безумовно, булевий в рядок".
Пояснення:
String(x)обробляє нулі, невизначені символи, [що-небудь] та викликає .toString()об'єкти.
'' + xдзвінки .valueOf()на x (переклад на номер), кидки на Symbols, можуть забезпечити залежні від реалізації результати.
x.toString() кидає на нулі та невизначено.
Примітка: String(x)усе ще не вдасться на об'єкти, що не мають прототипу, як-от Object.create(null).
Якщо вам не подобаються рядки типу "Привіт, невизначено" або ви хочете підтримувати об'єкти без прототипу, використовуйте наступну функцію перетворення типу:
/**
* 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()
Нижче наведено способи перетворення цілого числа в String в JS
Методи розташовані в порядку зменшення продуктивності.
(Результати тесту на продуктивність надає @DarckBlezzer у своїй відповіді)
var num = 1
Спосіб 1:
num = `$ {num}`
Спосіб 2:
num = num + ''
Спосіб 3:
num = Рядок (num)
Спосіб 4:
num = num.toString ()
Примітка: Ви не можете безпосередньо дзвонити tostring () з номера
Напр .: 2.toString () викине Uncaught SyntaxError : Недійсний або несподіваний маркер
Якщо вам цікаво, хто найефективніший, перевірте це, де я порівнюю всі різні число -> рядкові перетворення.
Виглядає 2+''або 2+""є найшвидшим.
Ми також можемо використовувати конструктор String . Відповідно до цього еталону, це найшвидший спосіб перетворення числа в 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".