Về dòng:
if (arr == false) console.log("It's false!");
Có lẽ những điều này sẽ giúp:
console.log(0 == false) // true
console.log([] == 0) // true
console.log([] == "") // true
Những gì tôi tin là đang xảy ra là boolean false
bị ép buộc để 0
so sánh với một đối tượng (phía bên trái). Đối tượng bị ép buộc thành một chuỗi (chuỗi trống). Sau đó, chuỗi trống cũng bị ép thành một số, cụ thể là số không. Và do đó, so sánh cuối cùng là 0
== 0
, đó là true
.
Chỉnh sửa: Xem phần này của thông số kỹ thuật để biết chi tiết về chính xác cách thức hoạt động của nó.
Đây là những gì đang xảy ra, bắt đầu từ quy tắc số 1:
1. Nếu Loại (x) khác với Loại (y), hãy đến bước 14.
Quy tắc tiếp theo được áp dụng là # 19:
19. Nếu Loại (y) là Boolean, trả về kết quả so sánh x == ToNumber (y).
Kết quả ToNumber(false)
là 0
, vì vậy bây giờ chúng ta có:
[] == 0
Một lần nữa, quy tắc số 1 bảo chúng ta nhảy sang bước # 14, nhưng bước tiếp theo thực sự áp dụng là # 21:
21. Nếu Loại (x) là Đối tượng và Loại (y) là Chuỗi hoặc Số, hãy trả về kết quả so sánh ToPrimitive (x) == y.
Kết quả ToPrimitive([])
là chuỗi rỗng, vì vậy bây giờ chúng ta có:
"" == 0
Một lần nữa, quy tắc số 1 bảo chúng ta chuyển sang bước # 14, nhưng bước tiếp theo thực sự áp dụng là # 17:
17. Nếu Loại (x) là Chuỗi và Loại (y) là Số, hãy trả về kết quả so sánh ToNumber (x) == y.
Kết quả ToNumber("")
là 0
, để lại cho chúng ta:
0 == 0
Bây giờ, cả hai giá trị có cùng loại, vì vậy các bước tiếp tục từ # 1 đến # 7, cho biết:
7. Nếu x là cùng một giá trị số với y, trả về true.
Vì vậy, chúng tôi trở lại true
.
Tóm lại:
ToNumber(ToPrimitive([])) == ToNumber(false)