2009-10-07 27 views

Trả lời

15

Toán tử === là bạn của bạn. Không bao giờ sử dụng toán tử ==; nó sẽ cắn bạn, như bạn thấy.

+9

Mặc dù câu trả lời của bạn là hữu ích, nó không trả lời câu hỏi. –

+3

Đúng. Các giá trị "sai" là: undefined, null, false, 0 và "". Như mikesamuel nói, [] coerces to "". Quá nhiều cho cái đầu tiên. Và một tham chiếu đối tượng không null là đúng, câu trả lời thứ hai. –

10

Danh sách trống, [] phải được coi là "falsey", tuy nhiên trong ![]! sau đó chuyển đổi hoạt động để kiểm tra tham chiếu đối tượng , trong đó một giá trị không null không được coi là "falsey".

+5

[] không phải là falsey. Đó là một tác dụng phụ của sự ép buộc chuỗi. Mảng [''] cũng là == sai, nhưng không phải là falsey. –

+0

@mikesamuel cảm ơn vì sự thấu hiểu! – Dave

4

Trước khi [] được so sánh với sai, nó bị ép buộc thành một chuỗi bị ép buộc thành một số, chuỗi rỗng trong trường hợp của mảng trống. Chuỗi rỗng coerces thành 0, là giá trị giống với giá trị false.

Sử dụng === thay vì == để tránh vấn đề này

Những mảng khác cũng falsey:

[''] 
    [[[]]] 
    (function() { var arr = []; arr[0] = arr; })() 
    [0] 
    ['-0.0'] 
+0

lý do tại sao danh sách bị ràng buộc thành chuỗi khi so sánh với giá trị boolean? Bất kỳ nguồn nào? – luntain

+0

Từ phần 11.9.3 của EcmaScript 262: 18. Nếu Loại (x) là Boolean, trả về kết quả của phép so sánh ToNumber (x) == y. 19. Nếu Type (y) là Boolean, trả về kết quả của phép so sánh x == ToNumber (y). Sau đó, ép một mảng vào một số bao gồm đầu tiên ép nó vào một chuỗi và sau đó xâu chuỗi đó vào một số. Đối với hầu hết các mảng, sẽ mang lại giá trị không thể so sánh NaN, nhưng đối với một số mảng, [], [0], [[0]], ['0.0'], v.v. chúng sẽ so sánh trung thực với sai. Bạn có thể thực nghiệm với hành vi ép buộc bằng cách đánh giá (+ [0]) v.v. –

Các vấn đề liên quan