Berikut ini menunjukkan yang "0"
salah dalam Javascript:
>>> "0" == false
true
>>> false == "0"
true
Jadi mengapa cetak berikut ini "ha"
?
>>> if ("0") console.log("ha")
ha
javascript
boolean
nonopolaritas
sumber
sumber
"0"
adalah string, dan karena itu tidak kosong, itu dievaluasi ke true."0" === false [...] false
'0'==false
tapi '0' bukan nilai falsey (ya Javascript bisa aneh)==
, mereka tidak pernah dikonversi menjadi boolean, jadi itu tidak berlaku. (Aturan untuk konversi tampaknya mendukung konversi ke angka.)Jawaban:
Alasannya adalah karena ketika Anda melakukannya secara eksplisit
"0" == false
, kedua belah pihak sedang dikonversi ke angka, dan kemudian perbandingan dilakukan.Ketika Anda melakukannya
if ("0") console.log("ha")
:, nilai string sedang diuji. Setiap string yang tidak kosong adalahtrue
, sedangkan string yang kosong adalahfalse
.sumber
Tabel yang menampilkan masalah:
dan ==
Moral cerita menggunakan ===
kredit pembuatan tabel: https://github.com/dorey/JavaScript-Equality-Table
sumber
NaN
. Maksudku,typeof NaN // number
tapiNaN === NaN // false
, hmm ...NaN
, jadi ketika Anda membandingkan 2 NaN, mereka memiliki nilai yang berbeda (saya kira). Baca kutipan pertama di sini .==
atau===
Operator untuk[]
,{}
,[[]]
,[0]
dan[1]
nilai-nilai tidak mengevaluasi untuk benar. Maksud saya[] == []
dan[] === []
juga salah.Ini sesuai dengan spec.
ToBoolean, menurut spesifikasi, adalah
Dan tabel itu mengatakan ini tentang string:
Sekarang, untuk menjelaskan mengapa
"0" == false
Anda harus membaca operator kesetaraan, yang menyatakan itu mendapatkan nilainya dari operasi abstrakGetValue(lref)
cocok dengan yang sama untuk sisi kanan.Yang menggambarkan bagian yang relevan ini sebagai:
Atau dengan kata lain, string memiliki basis primitif, yang memanggil kembali metode get internal dan akhirnya tampak salah.
Jika Anda ingin mengevaluasi hal-hal menggunakan penggunaan operasi GetValue
==
, jika Anda ingin mengevaluasi menggunakanToBoolean
, gunakan===
(juga dikenal sebagai operator kesetaraan "ketat")sumber
"a string has a primitive base, which calls back the internal get method and ends up looking false"
Apakah ini benar untuk semua string?Section 8.12.3: [[Get]] (P)
menjelaskan cara kerjanya. Memang benar hanya untuk case yang stringnya 0, seperti halnya sekelompok panggilan internal lainnya yang akhirnya menghasilkanGetOwnProperty
yang melihat bahwa "apa pun" adalah properti data, yang kemudian mengembalikan semua jalan kembali nilai itu. Inilah mengapa "0" salah, dan "bla" benar. Lihat beberapa video Douglas Crockford di teater pengembang Yahoo, ia menggambarkan "kebenaran" dalam JavaScript sedikit kurang kompleks daripada saya. Jika Anda mengerti apa arti "benar" dan "salah", Anda akan langsung memahami jawaban Bobince.Ini PHP di mana string
"0"
itu falsy (false-when-used-in-boolean-context). Dalam JavaScript, semua string non-kosong adalah benar.Kuncinya adalah bahwa
==
melawan boolean tidak mengevaluasi dalam konteks boolean, itu dikonversi menjadi angka, dan dalam kasus string yang dilakukan dengan parsing sebagai desimal. Jadi Anda mendapatkan Nomor0
bukannya boolean kebenarantrue
.Ini adalah desain bahasa yang sangat buruk dan itu salah satu alasan kami mencoba untuk tidak menggunakan
==
operator yang malang . Gunakan===
sebagai gantinya.sumber
sumber
Kutipan Anda di sekitar
0
membuatnya menjadi string, yang dievaluasi sebagai benar.Hapus tanda kutip dan itu harus bekerja.
sumber
Itu semua karena spesifikasi ECMA ...
"0" == false
karena aturan yang ditentukan di sini http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 ... Danif ('0')
dievaluasi benar karena aturan yang ditentukan di sini http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5sumber
Ekspresi "jika" menguji kebenaran, sedangkan tes ganda-sama untuk jenis-independen. Sebuah string selalu benar, seperti yang ditunjukkan orang lain di sini. Jika double-equal menguji kedua operan untuk kebenaran dan kemudian membandingkan hasilnya, maka Anda akan mendapatkan hasil yang Anda asumsikan secara intuitif, yaitu
("0" == true) === true
. Seperti yang dikatakan Doug Crockford dalam JavaScript- nya yang luar biasa : Bagian-Bagian yang Baik , "aturan-aturan yang [== memaksa tipe operan-operannya] rumit dan tidak dapat dilupakan .... Kurangnya transitivitas mengkhawatirkan." Cukuplah untuk mengatakan bahwa salah satu operan adalah tipe-dipaksakan untuk mencocokkan yang lain, dan bahwa "0" akhirnya ditafsirkan sebagai angka nol,sumber
== Operator kesetaraan mengevaluasi argumen setelah mengubahnya menjadi angka. Jadi string nol "0" dikonversi ke tipe data Number dan boolean false dikonversi ke Number 0. Jadi
Hal yang sama berlaku untuk `
=== Pemeriksaan kesetaraan ketat mengevaluasi argumen dengan tipe data asli
Hal yang sama berlaku untuk
Di
String "0" tidak membandingkan dengan argumen apa pun, dan string adalah nilai sebenarnya hingga atau kecuali jika dibandingkan dengan argumen apa pun. Persis seperti
Tapi
`
sumber
Ini karena JavaScript menggunakan paksaan tipe dalam konteks Boolean dan kode Anda
akan dipaksa untuk benar dalam konteks boolean.
Ada nilai-nilai kebenaran lain dalam Javascript yang akan dipaksa ke true dalam konteks boolean, dan dengan demikian mengeksekusi blok if adalah: -
sumber
memaksa x menggunakan toBoolean internal JavaScript (http://es5.github.com/#x9.2)
memaksa kedua belah pihak menggunakan pemaksaan toNumber internal (http://es5.github.com/#x9.3) atau toPrimitive untuk objek (http://es5.github.com/#x9.1)
Untuk perincian lengkap, lihat http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
sumber