Saya akan mulai menggunakan === (tiga kali lipat sama, perbandingan ketat) sepanjang waktu ketika membandingkan nilai string, tapi sekarang saya menemukannya
"foo" === new String("foo")
salah, dan sama dengan ini:
var f = "foo", g = new String("foo");
f === g; // false
Tentu saja:
f == g; // true
Jadi, apakah disarankan untuk selalu menggunakan == untuk perbandingan string, atau selalu mengonversi variabel menjadi string sebelum membandingkan?
javascript
object
equality
Michael Butler
sumber
sumber
foo
adalah string murni dannew String("foo")
merupakan Objek Stringnew String
(Sama sekali tidak berguna) daripada menggunakan==
new String("foo")
di Javascript? Saya belum pernah melihat kode seperti itu dalam kode yaitu jQuery ...String(obj)
untuk mengonversi string dalam kotak menjadi string primitif setelah Anda menerima parameter "string".("foo" === String(new String("foo"))) === true
Jawaban:
"foo"
adalah string primitif . (konsep ini tidak ada di C # atau Java)new String("foo")
adalah objek string berkotak.The
===
Operator berperilaku berbeda pada primitif dan objek .Saat membandingkan primitif (dari tipe yang sama),
===
akan mengembalikan nilai true jika keduanya memiliki nilai yang sama.Saat membandingkan objek,
===
akan mengembalikan nilai true hanya jika mereka merujuk ke objek yang sama (membandingkan dengan referensi). Jadinew String("a") !== new String("a")
,.Dalam kasus Anda,
===
mengembalikan salah karena operan memiliki tipe yang berbeda (satu primitif dan yang lainnya adalah objek).Primitif bukanlah objek sama sekali.
The
typeof
Operator tidak akan kembali"object"
untuk primitif.Saat Anda mencoba mengakses properti primitif (menggunakannya sebagai objek), bahasa Javascript akan mengotakkannya ke objek, membuat objek baru setiap saat. Ini dijelaskan dalam spesifikasi .
Inilah mengapa Anda tidak dapat menempatkan properti pada primitif:
Setiap kali Anda menulis
x.property
, objek kotak yang berbedaString
dibuat.sumber
typeof "foo"; // "string"
,typeof new String("foo"); // "object"
null
danundefined
.if( Object(a) !== a ) { //it's a primitive }
Menggunakan
===
,sebuah Objek tidak pernah sama dengan apapun kecuali referensi lain untuk dirinya sendiri.
primitif sama jika dibandingkan dengan primitif lain jika jenis dan nilainya sama.
sumber
new String("foo") === new String("foo")
adalahfalse
:-PThe
new
kata adalah seorang penjahat di sini ( seperti biasa , mungkin saya katakan) ...Saat Anda menggunakan
new
, Anda secara eksplisit mengungkapkan keinginan Anda untuk bekerja dengan objek . Ini mungkin mengejutkan bagi Anda, tetapi ini:... akan memberimu kekuatan
false
. Sederhana saja: perbandingan bukanlah bagian dalam objek, tetapi referensi objek. Dan mereka, tentu saja, tidak sama, karena dua objek berbeda diciptakan.Apa yang mungkin ingin Anda gunakan adalah konversi :
... dan itu akan memberi Anda, seperti yang diharapkan,
true
sebagai hasilnya, sehingga Anda dapat bersukacita dan sejahtera dengan rekan Andafoos
selamanya. )sumber
toString()
metode, misalnya.foo
adalah string murni dannew String("foo")
merupakan Objek Stringsumber
Dari node.js REPL ("node" pada baris perintah jika diinstal):
sumber