Casting ke string dalam JavaScript


184

Saya menemukan tiga cara untuk melemparkan variabel ke Stringdalam JavaScript.
Saya mencari tiga opsi dalam kode sumber jQuery, dan semuanya digunakan .
Saya ingin tahu apakah ada perbedaan di antara mereka:

value.toString()
String(value)
value + ""

DEMO

Mereka semua menghasilkan output yang sama, tetapi apakah salah satu dari mereka lebih baik daripada yang lain?
Saya akan mengatakan + ""memiliki kelebihan yang menghemat beberapa karakter, tetapi itu bukan keuntungan besar, hal lain?


1
Tampak bagi saya bahwa jika semua hal sama, standar toString()akan menjadi cara untuk pergi.
asawyer

1
@ Pengacara. Dan mengapa begitu? Jika mereka semua menghasilkan output yang sama dan melakukan hal yang sama, pilih satu dan ikuti. Ini adalah pendapat saya jika ini benar-benar terjadi di sini .
gdoron mendukung Monica

1
Dua metode pertama harus sama (Anda harus memeriksa standar tetapi konstruktor akan memanggil toString). Yang ketiga biasanya menghasilkan output yang sama tetapi melibatkan mekanisme yang sangat berbeda (selain kecepatan melibatkan panggilan yang berbeda sehingga mungkin tidak seperti yang Anda harapkan untuk setiap jenis objek).
Adriano Repetti

6
Menurut pendapat saya toStringsecara semantik cara paling jelas untuk mendokumentasikan diri sendiri fakta bahwa Anda mencoba untuk mendapatkan string yang setara dengan suatu objek. String(...)sedikit tumpul, dan value + ""sedikit peretasan. Ini juga memberi Anda kemampuan untuk menimpa default toStringdengan implementasi kustom jika Anda pernah perlu saya kira, sebagai manfaat sampingan kecil.
asawyer

2
@Adriano. Tapi + ""ini yang tercepat menurut jsperf, jadi ... itu bisa dilakukan dengan cara lain, kurasa.
gdoron mendukung Monica

Jawaban:


213

Mereka berperilaku berbeda saat valueitu null.

  • null.toString()melempar kesalahan - Tidak dapat memanggil metode 'toString' dari nol
  • String(null)kembali - "null"
  • null + ""juga mengembalikan - "null"

Perilaku yang sangat mirip yang terjadi jika valueadalah undefined(lihat jawaban jbabey ini ).

Selain itu, ada perbedaan kinerja yang dapat diabaikan, yang, kecuali jika Anda menggunakannya dalam putaran besar, tidak perlu dikhawatirkan.


Ini sebenarnya perbedaan yang menarik. Jadi, Anda harus menahan diri untuk tidak menggunakan toString()saat Anda belum memeriksanya null.
Sammy S.

@SammyS. tidak tahu apakah mencetak nullatau undefinedke layar adalah perilaku yang lebih diinginkan daripada kesalahan javascript ...
Justus Romijn

@JustusRomijn: Memang benar. Sementara itu, saya mulai menggunakan jenis Opsi untuk menangani kesalahan tersebut.
Sammy S.

Anda dapat memeriksa salah satu dari variabel yang dicor ini dengan typeof untuk memeriksa string. typeof (null + '') == 'string'
Bruce Lim

4
Ada kasus lain ketika mereka berperilaku berbeda. v + ''mengembalikan hasil yang salah jika v memiliki kedua metode toString () dan valueOf (). Penggabungan akan mengabaikan toString () dan akan menggunakan valueOf (). Contoh kelas di mana penyatuan
Mikita Belahlazau

26

Ada perbedaan, tetapi mereka mungkin tidak relevan dengan pertanyaan Anda. Misalnya, prototipe toString tidak ada pada variabel yang tidak terdefinisi, tetapi Anda bisa menggunakan undefined ke string menggunakan dua metode lainnya:

var foo;

var myString1 = String(foo); // "undefined" as a string

var myString2 = foo + ''; // "undefined" as a string

var myString3 = foo.toString(); // throws an exception

http://jsfiddle.net/f8YwA/


3
Jika suatu variabel sama sekali tidak didefinisikan, Anda masih akan mendapatkan kesalahan untuk String(). Contoh: String(test);melempar Uncaught ReferenceError: test is not defined, sementara var test; String(test);akan menghasilkan "undefined".
Anthony

17

Mereka berperilaku sama tetapi toStringjuga menyediakan cara untuk mengkonversi bilangan biner, oktal, atau string heksadesimal:

Contoh:

var a = (50274).toString(16)  // "c462"
var b = (76).toString(8)      // "114"
var c = (7623).toString(36)   // "5vr"
var d = (100).toString(2)     // "1100100"

9

Menurut tes JSPerf ini , mereka berbeda dalam kecepatan. Tetapi kecuali jika Anda akan menggunakannya dalam jumlah besar, salah satu dari mereka akan bekerja dengan baik.

Untuk kelengkapan: Seperti yang disebutkan asawyer , Anda juga dapat menggunakan .toString()metode ini.


2
Jsperf itu memiliki tes yang sama dua kali, saya mengeditnya dan new String()mengembalikan objek bukan aString
gdoron mendukung Monica

new String()mengembalikan objek ya. String()Namun, mengembalikan string, yang merupakan pertanyaan.
Connell

2
Ini tidak sepenuhnya benar. Seperti yang dapat Anda lihat dari hasil, menyatukan string kosong dan objek tidak menghasilkan hasil yang sama seperti menggabungkan objek dan string kosong. Selanjutnya, new String(blarg)memberi Anda Stringobjek yang dapat Anda hubungi toString(). Di debugger Chrome saya, mereka secara efektif menghasilkan objek yang sama kecuali perbedaan kata.
Sammy S.

@SammyS. Bisakah Anda menambahkan contoh hasil kinerja ke jawaban Anda? Tautan jsperf saat ini sedang down dan pastinya akan kembali dalam 5 tahun ke depan.
mxmlnkn

9

Selain semua hal di atas, orang harus mencatat bahwa, untuk nilai yang ditentukan v:

  • String(v) panggilan v.toString()
  • '' + vpanggilan v.valueOf()sebelum jenis pemain lain

Jadi kita bisa melakukan sesuatu seperti:

var mixin = {
  valueOf:  function () { return false },
  toString: function () { return 'true' }
};
mixin === false;  // false
mixin == false;    // true
'' + mixin;       // "false"
String(mixin)     // "true"

Diuji dalam FF 34.0 dan Node 0.10


8

jika Anda setuju dengan null, undefined, NaN, 0, dan false semua casting ke '' maka (s ? s+'' : '')lebih cepat.

lihat http://jsperf.com/cast-to-string/8

perhatikan - ada perbedaan yang signifikan antar browser saat ini.


4

Nyata contoh dunia: Aku punya fungsi log yang dapat disebut dengan jumlah sewenang-wenang parameter: log("foo is {} and bar is {}", param1, param2). Jika sebuah DEBUGflag diset ke true, tanda kurung diganti dengan parameter yang diberikan dan string diteruskan ke console.log(msg). Parameter dapat dan akan menjadi Strings, Numbers dan apa pun yang dapat dikembalikan oleh panggilan JSON / AJAX, bahkan mungkin null.

  • arguments[i].toString()bukan pilihan, karena nullnilai yang mungkin (lihat jawaban Connell Watkins)
  • JSLint akan mengeluh arguments[i] + "". Ini mungkin atau mungkin tidak mempengaruhi keputusan tentang apa yang akan digunakan. Beberapa orang secara ketat mematuhi JSLint.
  • Di beberapa browser, menggabungkan string kosong sedikit lebih cepat daripada menggunakan fungsi string atau konstruktor string (lihat tes JSPerf dalam jawaban Sammys S.). Di Opera 12 dan Firefox 19, menyatukan string kosong lebih cepat (95% di Firefox 19) - atau setidaknya JSPerf mengatakan demikian.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.