Apa cara terbaik untuk mengubah angka menjadi string di JavaScript?

519

Apa cara "terbaik" untuk mengonversi angka menjadi string (dalam hal keunggulan kecepatan, keunggulan kejelasan, keunggulan memori, dll)?

Beberapa contoh:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

Pacerier
sumber

Jawaban:

516

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 '' + numsampel.

scunliffe
sumber
58
Ada kasus di mana konversi mungkin tidak mengembalikan jawaban yang lebih disukai: '' + 123e-50pengembalian "1.23e-48".
hongymagic
21
@hongymagic: jawaban itu sebenarnya satu-satunya yang dapat dipikirkan: nomor tidak peduli atau tidak tahu bagaimana cara memasukkannya, dan representasi cetakan standar adalah tepat satu digit sebelum titik.
Svante
4
Saya menjalankan tes di jsben.ch/ghQYR , setiap kali itu menunjukkan hasil yang berbeda!
Maryam Saeidi
2
Saya suka jawaban ini karena null footidak melempar kesalahan.
ttugates
2
@MaryamSaeidi: Menggunakan Drublic 's jsperf.com pengujian di atas tampaknya lebih konsisten.
Giraldi
364

Menurut pendapat saya n.toString()mengambil hadiah untuk kejelasannya, dan saya tidak berpikir itu membawa biaya tambahan.

CarlosZ
sumber
Itu memang membawa beberapa overhead meskipun tidak signifikan dalam versi browser terbaru. Di Firefox Quantum setidaknya
peterchaula
11
Ini tidak aman. n mungkin nol atau tidak terdefinisi.
david.pfx
20
@ david.pfx pertanyaannya bertanya bagaimana cara mengkonversi nilai numerik ke string. Memberikan contoh nilai non-numerik (mis. null, undefined) Yang tidak berfungsi dengan jawaban ini sulit membuatnya "tidak aman".
Michael Martin-Smucker
5
@ MichaelMartin-Smucker: Jika Anda menulis banyak JS, Anda menyadari bahwa semuanya jarang dipotong dan dikeringkan. Pertanyaan terbuka dan IMO jawaban yang baik setidaknya harus mengakui masalah string yang sebenarnya nol atau tidak terdefinisi. YMMV.
david.pfx
@ david.pfx Saya telah menulis BANYAK js dan saya tidak ingat kapan terakhir kali saya membutuhkan nomor sebagai string dan apa pun kecuali angka sebagai string sudah cukup. Ini jawaban yang benar. Tidak ada jawaban untuk penanganan nullatau undefinedkarena 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.
George Reith
73

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 nnol atau tidak ditentukan.

Bryan Kyle
sumber
12
Pertanyaannya adalah tentang mengonversi angka, bukan tentang mengonversi angka, atau null, atau undefined. Jika nada nullatau undefinedkarena 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.
Matt Wallis
1
String(n)baik untuk digunakan dalam gaya fungsional, misalnya dengan perpaduan garis bawah _.compose(funcThatNeedsAStringParam, String).
Rik Martins
2
String (null) tidak akan membuat crash progam, tetapi itu akan mengembalikan string literal "null", yang mungkin bukan yang Anda inginkan. Jika data bisa menjadi nol, maka Anda harus menanganinya secara eksplisit.
Peter Smartt
1
@ MatWallis Saya pikir itu harus menjadi keputusan pengembang, bukan penjawab, bukan begitu?
forresthopkinsa
31

... 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

Sumber

Mohammad Arif
sumber
17

Jelas-jelas-lidah:

var harshNum = 108;
"".split.call(harshNum,"").join("");

Atau di ES6 Anda cukup menggunakan string template :

var harshNum = 108;
`${harshNum}`;
cssimsek
sumber
Jika saya menjalankan tolok ukur dengan template ES6, kadang-kadang bahkan terbukti lebih cepat daripada '' + numbermetode ini. Ini mengatakan, hasil dari tolok ukur ini sangat bervariasi ketika melakukan beberapa kali sehingga tidak yakin apakah mereka harus dianggap terlalu serius.
Nico Van Belle
15

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 .

johndodo
sumber
Ini juga aman jika n mungkin bukan angka.
david.pfx
Tapi begitu juga n.toString(), bukan?
amn
1
@amn jika nini undefinedakan melemparkan kesalahan sintaks dengan menggunakan.toString()
Jee Mok
Bukankah ini hanya memberikan hasil yang sama seperti String(n)dalam semua kasus? Satu-satunya perbedaan adalah bahwa itu kurang jelas.
Bennett McElwee
Dan jauh lebih lambat.
Adrian Bartholomew
12

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'
sgokhales
sumber
2
Perhatikan bahwa itu harus di dalam parens: (5.41 + '')untuk menggunakan metode String seperti .substring()dan lain
Gjaa
Mengapa itu perlu diperhatikan?
Adrian Bartholomew
7

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.

Tim
sumber
2
Tidak aman kecuali Anda tahu itu nomor.
david.pfx
6

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.

tes kinerja, deskripsi di atas

Erick
sumber
2

Saya suka dua yang pertama karena lebih mudah dibaca. Saya cenderung menggunakan String(n)tetapi itu hanya masalah gaya daripada hal lain.

Itu kecuali Anda memiliki garis sebagai

var n = 5;
console.log ("the number is: " + n);

yang sangat jelas

Aleadam
sumber
2

Saya pikir itu tergantung pada situasinya tetapi bagaimanapun Anda dapat menggunakan .toString()metode ini karena sangat jelas untuk dipahami.

Serghei
sumber
2

.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.

Mubeen Khan
sumber
1

Jika saya harus mempertimbangkan semuanya, saya akan menyarankan mengikuti

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

IMHO, ini cara tercepat untuk mengkonversi ke string. Koreksi saya jika saya salah.

Kumar
sumber
1

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.

'' + xpanggilan .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));
}
Alexander Shostak
sumber
1

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()
Mohit Dabas
sumber
1

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

Arun Joshla
sumber
0

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.

https://jsperf.com/int-2-string

Alex Cory
sumber
0

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 " + numdi peramban populer Google Chrome.

peterchaula
sumber
0

Metode toFixed()juga akan memecahkan tujuan.

var n = 8.434332;
n.toFixed(2)  // 8.43
Shaik Rasool
sumber
0

Anda dapat memanggil Numberobjek dan kemudian memanggil toString().

Number.call(null, n).toString()

Anda dapat menggunakan trik ini untuk objek asli javascript lainnya.

ufadiz
sumber
0

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.

Inilah tautan yang dibaca .

roger
sumber
0

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
DarckBlezzer
sumber
Yay - test4 adalah yang biasa saya gunakan !!
Adrian Bartholomew
0

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.

Shahaed
sumber