Mengenai garis:
if (arr == false) console.log("It's false!");
Mungkin ini akan membantu:
console.log(0 == false) // true
console.log([] == 0) // true
console.log([] == "") // true
Apa yang saya yakini sedang terjadi adalah bahwa boolean false
dipaksa 0
untuk dibandingkan dengan objek (sisi kiri). Objek dipaksa ke string (string kosong). Kemudian, string kosong dipaksa menjadi angka, juga, yaitu nol. Dan perbandingan terakhirnya adalah 0
== 0
, yaitu true
.
Sunting: Lihat bagian spesifikasi ini untuk detail tentang cara kerjanya.
Inilah yang terjadi, mulai dari aturan # 1:
1. Jika Tipe (x) berbeda dari Tipe (y), lanjutkan ke langkah 14.
Aturan selanjutnya yang berlaku adalah # 19:
19. Jika Tipe (y) adalah Boolean, kembalikan hasil perbandingan x == ToNumber (y).
Hasilnya ToNumber(false)
adalah 0
, jadi sekarang kita memiliki:
[] == 0
Sekali lagi, aturan # 1 memberitahu kita untuk melompat ke langkah # 14, tetapi langkah selanjutnya yang benar-benar berlaku adalah # 21:
21. Jika Tipe (x) adalah Objek dan Tipe (y) adalah String atau Angka, kembalikan hasil perbandingan ToPrimitive (x) == y.
Hasilnya ToPrimitive([])
adalah string kosong, jadi kita sekarang memiliki:
"" == 0
Sekali lagi, aturan # 1 memberitahu kita untuk melompat ke langkah # 14, tetapi langkah selanjutnya yang benar-benar berlaku adalah # 17:
17. Jika Tipe (x) adalah String dan Tipe (y) adalah Angka, kembalikan hasil perbandingan ToNumber (x) == y.
Hasilnya ToNumber("")
adalah 0
, yang meninggalkan kita dengan:
0 == 0
Sekarang, kedua nilai memiliki tipe yang sama, jadi langkah-langkahnya berlanjut dari # 1 hingga # 7, yang mengatakan:
7. Jika x adalah nilai angka yang sama dengan y, kembalikan benar.
Jadi kita kembali true
.
Secara singkat:
ToNumber(ToPrimitive([])) == ToNumber(false)