2013-06-27 55 views
6

0 == false'0' == false都是 '真'0對 '0' 與布爾運算符

然而,(true && 0)是 '假',而(true && '0')是 '真'。

爲什麼?

+8

相等比較的操作數遵循一定的規則。用你的前兩個例子,它們被轉換成數字,因此是平等的。使用'&&'和'||',對操作數進行真實性測試。唯一錯誤的值是'false','0',''''','null','undefined'和'NaN'。希望這可以幫助:http://es5.github.io/#x11.9.3 – Ian

+0

idk關於你,但是當我輸入'(true && 0)'到控制檯時,我得到了'0',當我做'(true && '0')'我得到''0'' – aug

+2

@aug我認爲它們或多或少被用在'if'語句中 – Ian

回答

6

抽象比較==)規則ES5 11.9.3描述而對於邏輯運算符(&&)中的規則ES5 11.11中描述。

總之,==只比&&複雜。其中&&僅使用內部ToBoolean()來評估其操作數,==具有可能導致使用ToBoolean(),ToNumber()和/或ToPrimitive()的各種條件。

  1. (0 == false) == true

    7.如果Type(y)爲布爾型,返回比較的結果X == ToNumber(y)的

    ToNumber(false) === 0,所以0 == 0,所以true

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

    這也通過步驟7,導致'0' == 0

    然後,在頂部開始過,它到達步驟5:

    5.如果Type(x)的字符串和類型(y)爲數量, 返回的比較ToNumber的結果(X )== y。

    ToNumber('0') === 0,如此反覆0 == 0,再次true

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

    &&簡單地返回第一個操作數,如果它是falsyToBoolean(...) === false),或者第二個操作數。

    這是嚴格的(true && 0) === 0

    而且,當作爲if條件使用時,結果(0)也將是passed through ToBoolean(...)ToBoolean(0) === false

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

    這再次返回第二個操作數,'0'

    然而這次ToBoolean('0') === true'0'是非空字符串,因此它是truthy

另外,如果你想更簡單的比較規則,使用嚴格比較===11.9.6)。

+1

'(true &&'0')== true'實際上是錯誤的(因爲''' 0'!= true')。如果你想強調真實性和「ToBoolean」操作,你最好使用'!!(true &&'0')' – Bergi

-2

'0'(或任何非空字符串)在JS中是'truthy'。然而,==操作符會執行一些奇怪的類型強制操作,這就是爲什麼許多傑出的JS人物,包括Crockford高度不鼓勵它的原因。這是一個很好的例子,爲什麼你應該避免它,它需要字符串'0'並將它強制爲一個虛假的值。

下面是解釋了這個過程的鏈接:

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 

比你的例子因此更奇怪的是:

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

Au contraire mon ami,它絕對與==和它的強制效果有關。我從未提及過===所以不確定你的評論來自哪裏。 –