Jawaban:
seperti ini:
var foo = 45;
var bar = '' + foo;
Sebenarnya, meskipun saya biasanya melakukannya seperti ini untuk kenyamanan sederhana, lebih dari 1.000 iterasi yang muncul untuk kecepatan mentah ada keuntungan untuk.toString()
Lihat tes Kinerja di sini (bukan oleh saya, tetapi ditemukan ketika saya pergi untuk menulis sendiri): http://jsben.ch/#/ghQYR
Tercepat berdasarkan pada tes JSPerf di atas: str = num.toString();
Perlu dicatat bahwa perbedaan dalam kecepatan tidak terlalu signifikan ketika Anda menganggap itu dapat melakukan konversi dengan cara 1 Juta kali dalam 0,1 detik .
Pembaruan: Kecepatan tampaknya sangat berbeda oleh browser. Di Chrome num + ''
tampaknya menjadi yang tercepat berdasarkan tes ini http://jsben.ch/#/ghQYR
Pembaruan 2: Sekali lagi berdasarkan pengujian saya di atas, harus dicatat bahwa Firefox 20.0.1 mengeksekusi .toString()
sekitar 100 kali lebih lambat daripada '' + num
sampel.
null foo
tidak melempar kesalahan.
Menurut pendapat saya n.toString()
mengambil hadiah untuk kejelasannya, dan saya tidak berpikir itu membawa biaya tambahan.
null
, undefined
) Yang tidak berfungsi dengan jawaban ini sulit membuatnya "tidak aman".
null
atau undefined
karena spesifik aplikasi, sementara saya membayangkan (n || defaultNumber).toString()
apa yang kebanyakan orang inginkan dalam situasi seperti itu saya sangat tidak setuju kita harus mengerjakan semua pertanyaan. Ini tentang mengonversi angka menjadi string, arsitektur yang bagus, dan konversi jenis lain jika diperlukan, merupakan pelajaran terpisah.
Konversi eksplisit sangat jelas bagi seseorang yang baru mengenal bahasa tersebut. Menggunakan tipe paksaan, seperti yang disarankan orang lain, mengarah ke ambiguitas jika pengembang tidak mengetahui aturan paksaan. Pada akhirnya waktu pengembang lebih mahal daripada waktu CPU, jadi saya akan mengoptimalkan untuk yang pertama dengan biaya yang terakhir. Yang sedang berkata, dalam hal ini perbedaannya mungkin diabaikan, tetapi jika tidak saya yakin ada beberapa kompresor JavaScript yang layak yang akan mengoptimalkan hal semacam ini.
Jadi, untuk alasan di atas saya akan pergi dengan: n.toString()
atau String(n)
. String(n)
mungkin merupakan pilihan yang lebih baik karena itu tidak akan gagal jika n
nol atau tidak ditentukan.
null
, atau undefined
. Jika n
ada null
atau undefined
karena bug dalam program saya, maka saya lebih suka program saya gagal dalam keadaan ini, untuk memberi saya kesempatan lebih baik untuk menemukan dan memperbaiki bug. Program crash adalah hadiah untuk programmer, untuk membantunya menemukan bug :-). Alternatifnya adalah memberikan perangkat lunak yang tidak berfungsi seperti yang dirancang, setelah dengan hati-hati menutupi bug. Jadi, saya bukan penggemar menggunakan String(n)
untuk menutupi kesalahan.
String(n)
baik untuk digunakan dalam gaya fungsional, misalnya dengan perpaduan garis bawah _.compose(funcThatNeedsAStringParam, String)
.
... JavaScript parser mencoba menguraikan notasi titik pada angka sebagai literal titik apung.
2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first
Jelas-jelas-lidah:
var harshNum = 108;
"".split.call(harshNum,"").join("");
Atau di ES6 Anda cukup menggunakan string template :
var harshNum = 108;
`${harshNum}`;
'' + number
metode ini. Ini mengatakan, hasil dari tolok ukur ini sangat bervariasi ketika melakukan beberapa kali sehingga tidak yakin apakah mereka harus dianggap terlalu serius.
Jawaban lain sudah mencakup opsi lain, tetapi saya lebih suka yang ini:
s = `${n}`
Singkat, ringkas, sudah digunakan di banyak tempat lain (jika Anda menggunakan kerangka kerja modern / versi ES) jadi itu taruhan yang aman setiap programmer akan memahaminya.
Bukan berarti (biasanya) penting, tetapi juga tampaknya termasuk yang tercepat dibandingkan dengan metode lain .
n.toString()
, bukan?
n
ini undefined
akan melemparkan kesalahan sintaks dengan menggunakan.toString()
String(n)
dalam semua kasus? Satu-satunya perbedaan adalah bahwa itu kurang jelas.
Cara paling sederhana untuk mengonversi variabel apa pun menjadi string adalah dengan menambahkan string kosong ke variabel itu.
5.41 + '' // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'
(5.41 + '')
untuk menggunakan metode String seperti .substring()
dan lain
Jika Anda perlu memformat hasil ke sejumlah tempat desimal tertentu, misalnya untuk mewakili mata uang, Anda memerlukan sesuatu seperti toFixed()
metode.
number.toFixed( [digits] )
digits
adalah jumlah digit untuk ditampilkan setelah tempat desimal.
Saya menggunakan https://jsperf.com untuk membuat test case untuk kasus-kasus berikut:
number + ''
`${number}`
String(number)
number.toString()
https://jsperf.com/number-string-conversion-speed-comparison
Pada 24 Juli 2018, hasilnya mengatakan itu number + ''
adalah yang tercepat di Chrome, di Firefox yang terkait dengan string string literal.
Keduanya String(number)
, dan number.toString()
sekitar 95% lebih lambat daripada opsi tercepat.
.toString () adalah fungsi typecasting bawaan, saya bukan ahli dalam perincian itu, tetapi setiap kali kami membandingkan metodologi eksplisit tipe casting ayat bawaan, solusi bawaan selalu lebih disukai.
Satu-satunya solusi yang valid untuk hampir semua kemungkinan kasus yang ada dan yang akan datang (input adalah angka, null, tidak terdefinisi, Simbol, apa pun) adalah String(x)
. Jangan menggunakan 3 cara untuk operasi sederhana, berdasarkan pada asumsi tipe nilai, seperti "di sini saya mengkonversi pasti angka ke string dan di sini pasti boolean ke string".
Penjelasan:
String(x)
menangani nulls, undefined, Symbols, [anything] dan memanggil .toString()
objek.
'' + x
panggilan .valueOf()
pada x (casting ke nomor), melempar pada Simbol, dapat memberikan hasil tergantung implementasi.
x.toString()
melempar pada nol dan tidak terdefinisi.
Catatan: String(x)
masih akan gagal pada objek yang kurang seperti prototipe Object.create(null)
.
Jika Anda tidak menyukai string seperti 'Hello, undefined' atau ingin mendukung objek tanpa prototipe, gunakan fungsi konversi tipe berikut:
/**
* 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));
}
Dengan literal angka, titik untuk mengakses properti harus dibedakan dari titik desimal. Ini memberi Anda opsi berikut jika Anda ingin memohon ke String () pada nomor literal 123:
123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()
Di bawah ini adalah metode untuk mengkonversi Integer ke String di JS
Metode-metode tersebut disusun dalam urutan kinerja yang menurun.
(Hasil tes kinerja diberikan oleh @DarckBlezzer dalam jawabannya)
var num = 1
Metode 1:
num = `$ {num}`
Metode 2:
num = num + ''
Metode 3:
num = String (num)
Metode 4:
num = num.toString ()
Catatan: Anda tidak dapat langsung memanggil tostring () dari suatu nomor
Misalnya: 2.toString () akan membuang Uncaught SyntaxError : Token tidak valid atau tidak terduga
Jika Anda ingin tahu yang mana yang paling performan periksa ini di mana saya membandingkan semua angka yang berbeda -> Konversi string.
Sepertinya 2+''
atau 2+""
yang tercepat.
Kita juga bisa menggunakan konstruktor String . Menurut tolok ukur ini, ini adalah cara tercepat untuk mengonversi Angka menjadi String di Firefox 58 meskipun lebih lambat daripada
" + num
di peramban populer Google Chrome.
Metode toFixed()
juga akan memecahkan tujuan.
var n = 8.434332;
n.toFixed(2) // 8.43
Baru saja menemukan ini baru-baru ini, metode 3 dan 4 tidak sesuai karena bagaimana string disalin dan kemudian disatukan. Untuk program kecil masalah ini tidak signifikan, tetapi untuk aplikasi web nyata tindakan ini di mana kita harus berurusan dengan manipulasi string frekuensi dapat mempengaruhi kinerja dan keterbacaan.
Saya akan mengedit kembali ini dengan lebih banyak data ketika saya punya waktu, karena sekarang ini baik-baik saja ...
Tes dalam simpuljs 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")
keluaran
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
Tampaknya hasil yang sama ketika menggunakan node.js. Saya menjalankan skrip ini:
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");
dan mendapat hasil sebagai berikut:
❯ node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms
Waktu yang sama setiap kali saya menjalankannya.
'' + 123e-50
pengembalian"1.23e-48"
.