Boot interpreter / konsol Anda dan coba perbandingannya
> ",,," == Array(4)
True
Mengapa? Pada awalnya saya berpikir mungkin karena Anda dapat memikirkan ",,," sebagai larik empat karakter dengan potongan penghentian '\ 0', mungkin itu sebabnya, tapi
> "..." == Array(4)
Menampilkan "False". Jadi kenapa? Saya tahu itu adalah sedikit lelucon aneh yang mengetik di Javascript, tapi hanya ingin tahu apa yang menggarisbawahi perilaku ini. Diperoleh ini dari presentasi Zed Shaw yang luar biasa di sini btw .
javascript
ZenLikeThat
sumber
sumber
===
daripada==
.Jawaban:
Karena operan tangan kanan diubah menjadi string dan representasi string
Array(4)
adalah,,,
:Jika Anda menggunakan fungsi konstruktor larik dan meneruskan angka, itu akan menyetel panjang larik ke angka itu. Jadi Anda dapat mengatakan Anda memiliki empat indeks kosong (sama seperti
[,,,]
) dan representasi string default dari array adalah daftar elemennya yang dipisahkan koma:Bagaimana perbandingan tersebut bekerja dijelaskan dalam bagian 11.9.3 spesifikasi . Di sana Anda akan melihat (
x == y
):(array adalah objek dalam JavaScript)
dan jika Anda mengikuti
ToPrimitive
metode tersebut, Anda akhirnya akan menemukan bahwa metode itu memanggiltoString
.sumber
Array.join(",")
.Secara internal berjalan
sumber
Coba gunakan
===
. Saat menggunakan==
dalam Javascript, itu akan mencoba untuk mentransmisikan variabel, sehingga menyebabkan masalah seperti ini. Konsol mentransmisikanArray(4)
ke representasi string (yaituArray(4).toString
), yaitu",,,"
. Alasan adanya koma adalah karena.toString()
fungsi menambahkannya ke item terpisah dalam larik.Lihat cuplikan di bawah ini:
sumber
Ini karena
Array(4)
menginisialisasi array dari 4 nilai kosong, yang==
secara implisit mengonversi, jadi:Semuanya serupa.
==
melakukan konversi jenis implisit sebelum membandingkan nilai, yang dapat menghasilkan hasil yang tidak dapat diprediksi. Gunakan===
untuk memeriksa jenis dan nilainya.sumber
Membandingkan Array dengan string memaksa Array menjadi string sebelum melakukan perbandingan. Memaksakan Array 4-elemen kosong ke string menghasilkan string yang sama persis.
sumber
Saya pertama kali mengira itu adalah sesuatu dengan "prototipe" ... tetapi setelah sedikit penyelidikan saya mencapai kesimpulan yang menyedihkan ...
Rupanya itu adalah hal js internal dan lebih tidak jelas dengan tidak banyak logika ...
Coba saja
dan tidak ada paksaan pada tipe juga ...
dan Anda akan mendapatkan FALSE
Anda tahu itu
null==null
,null===null
dan bahkanundefined==undefined
danundefined===undefined
mengembalikan TRUE ... jadi ... itu agak tidak jelas ...Array(4)==[,,,]
harus benar jugasumber