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 falsedipaksa 0untuk 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)