Ini sesuai dengan spec.
12.5 Pernyataan if
.....
2. Jika ToBoolean (GetValue (exprRef)) benar, maka
Sebuah. Kembalikan hasil evaluasi Pernyataan pertama.
3. Lain,
....
ToBoolean, menurut spesifikasi, adalah
Operasi abstrak ToBoolean mengubah argumennya menjadi nilai tipe Boolean sesuai dengan Tabel 11:
Dan tabel itu mengatakan ini tentang string:
Hasilnya salah jika argumennya adalah String kosong (panjangnya nol); jika tidak, hasilnya benar
Sekarang, untuk menjelaskan mengapa "0" == false
Anda harus membaca operator kesetaraan, yang menyatakan itu mendapatkan nilainya dari operasi abstrak GetValue(lref)
cocok dengan yang sama untuk sisi kanan.
Yang menggambarkan bagian yang relevan ini sebagai:
jika IsPropertyReference (V), maka
Sebuah. Jika HasPrimitiveBase (V) salah, maka mari menjadi metode internal [[Get]], jika tidak, biarkan get
menjadi metode internal [[Get]] khusus yang didefinisikan di bawah ini.
b. Kembali hasil memanggil metode internal get menggunakan basis sebagai nilai ini, dan lewat
GetReferencedName (V) untuk argumen
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 menggunakan ToBoolean
, gunakan ===
(juga dikenal sebagai operator kesetaraan "ketat")
"0"
adalah string, dan karena itu tidak kosong, itu dievaluasi ke true.