Відповіді:
подобається це:
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"
.