2013-06-27 38 views
6

0 == false'0' == false đều 'true'0 vs '0' với các toán tử logic

Tuy nhiên, (true && 0) là 'false', trong khi (true && '0') là 'true'.

Tại sao?

+8

Các toán hạng của một so sánh bình đẳng theo quy tắc nhất định. Với hai ví dụ đầu tiên của bạn, chúng được chuyển đổi thành số và do đó bằng nhau. Sử dụng '&&' và '||', toán hạng được kiểm tra tính trung thực. Giá trị falsey duy nhất là 'false',' 0', '" "', 'null',' undefined' và 'NaN'. Hy vọng rằng điều này có thể giúp: http://es5.github.io/#x11.9.3 – Ian

+0

idk về bạn nhưng khi tôi gõ '(true && 0)' vào giao diện điều khiển tôi nhận được '0' và khi tôi làm' (true && '0') 'Tôi nhận được' "0" ' – aug

+2

@aug Tôi nghĩ rằng chúng ít nhiều được sử dụng trong câu lệnh' if' – Ian

Trả lời

6

Các so sánh trừu tượng (==) quy tắc được mô tả trong ES5 11.9.3 trong khi các quy tắc cho các nhà khai thác hợp lý (&&) đều được mô tả trong ES5 11.11.

Tóm lại, == chỉ phức tạp hơn &&. Trường hợp && chỉ sử dụng nội bộ ToBoolean() để đánh giá toán hạng của nó, == có các điều kiện khác nhau có thể dẫn đến việc sử dụng ToBoolean(), ToNumber() và/hoặc ToPrimitive().

  1. (0 == false) == true:

    7. Nếu Kiểu (y) là Boolean, trả lại kết quả của việc so sánh x == ToNumber (y)

    ToNumber(false) === 0, vì vậy 0 == 0, vì vậy true .

  2. ('0' == false) == true:

    này cũng đi qua bước 7, kết quả là '0' == 0.

    Sau đó, bắt đầu lại ở phía trên, nó đạt bước 5:

    5. Nếu Type (x) được Chuỗi và Type (y) là Number, trả lại kết quả của việc so sánh ToNumber (x) == y.

    ToNumber('0') === 0, vì vậy lại 0 == 0 và lại true.

  3. !!(true && 0) == false

    && chỉ đơn giản trả về toán hạng 1 nếu nó falsy (ToBoolean(...) === false), hoặc các toán hạng 2.

    Đó là đúng (true && 0) === 0.

    Và khi được sử dụng làm điều kiện if, kết quả (0) cũng sẽ là passed through ToBoolean(...)ToBoolean(0) === false.

  4. !!(true && '0') == true

    Một lần nữa, điều này sẽ trả về toán hạng 2, '0'.

    Lần này, tuy nhiên, ToBoolean('0') === true'0' là một chuỗi không trống, làm cho nó sự thật.

Ngoài ra, nếu bạn muốn quy tắc so sánh đơn giản, sử dụng so sánh nghiêm ngặt (===, 11.9.6).

+1

'(true && '0') == true' là false (như' ' 0 '! = True'). Nếu bạn muốn nhấn mạnh tính trung thực và thao tác 'ToBoolean' bạn nên sử dụng' !! (true && '0') ' – Bergi

-2

'0' (hoặc bất kỳ chuỗi không trống nào) là 'trung thực' trong JS. Tuy nhiên, toán tử == thực hiện một số kiểu cưỡng chế kỳ lạ, đó là lý do tại sao nhiều con số JS nổi bật bao gồm Crockford không khuyến khích nó. Đây là một ví dụ tốt về lý do tại sao bạn nên tránh nó, nó lấy chuỗi '0' và ép buộc nó thành một giá trị falsey.

Dưới đây là một liên kết mà giải thích quá trình này:

http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html

If Type(x) is Boolean, return the result of the comparison 
    ToNumber(x) == y: false == 0 and true == 1 but true != 2 

Vì vậy, thậm chí người lạ hơn ví dụ của bạn là thế này:

('1' == true) // true 
('2' == true) // false! 
+0

Au contraire mon ami, nó hoàn toàn liên quan đến == và hiệu ứng cưỡng chế của nó. Tôi không bao giờ đề cập === vì vậy không chắc chắn nơi bình luận của bạn đến từ đâu. –

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