2015-12-02 163 views
-3

我有以下對象:JavaScript語法 - if語句

var quarters = { 
       q1:false, 
       q2:false, 
       q3:false, 
       q4:{name: "i'm q4"} 
       } 

我的問題是,爲什麼下面的IF返回true?

if (quarters.q1 == quarters.q2 == quarters.q3 == quarters.q4 == false) 

我該怎麼問if all quarters are false

我不使用!quarters.q1 && !quarters.q2 && !quarters.q3 && !quarters.q4的原因是因爲有些時候,某些屬性根本沒有定義。

+1

'toppingOrder'是'undefined' – Dropout

+7

'false == false'是'true','true == false'是'false','false == false'是'true' ...你可以用筆和紙。 – deceze

+0

我剛修好了拼寫錯誤 – TBE

回答

10

爲什麼下面的IF返回true?

假設toppingOrderquarters,讓填寫並看看我們

if (toppingOrder.q1 == toppingOrder.q2 == toppingOrder.q3 == toppingOrder.q4 == false) 
// same as 
if (false == false == false == {name: "i'm q4"} == false) 
// same as 
if ((((false == false) == false) == {name: "i'm q4"}) == false) 
// same as 
if (((true == false) == {name: "i'm q4"}) == false) 
// same as 
if ((false == {name: "i'm q4"}) == false) 
// same as 
if (false == false) 
// same as 
if (true) 

我怎麼能問,如果各方都是假的?

你要麼必須循環,使用邏輯與&&或一些陣列方法類似.every

// logical AND `&&` 
if (
     false === toppingOrder.q1 
    && false === toppingOrder.q2 
    && false === toppingOrder.q3 
    && false === toppingOrder.q4 
    ) // ... 

// Array `.every` 
if (
    [toppingOrder.q1, toppingOrder.q2, toppingOrder.q3, toppingOrder.q4].every(
      function (e) {return e === false;} 
     ) 
    ) // ... 

它實際上是更容易測試所有true,因此,如果您考慮可以像那樣用短語if來代替,例如使用邏輯NOT !

if (!toppingOrder.q1 && !toppingOrder.q2 && !toppingOrder.q3 && !toppingOrder.q4) // ... 
// or 
if (
    [!toppingOrder.q1, !toppingOrder.q2, !toppingOrder.q3, !toppingOrder.q4].every(Boolean) 
    ) // ... 
+0

很好的解釋,這就是我一直在尋找的東西:瞭解我在做什麼錯了+瞭解如何實現我的目標 – TBE

+0

@TBE檢查他們是否被定義是[另一個問題](http:// stackoverflow。com/a/5113396/1326147):對於你的情況,你可以簡單地使用'e == null',但是注意'false == null'或''== == null'都返回'false'和'undefined == null'返回'true'。 – Armfoot

+0

@武裝檢查_falsy_就像邏輯a一樣簡單不行,這就是爲什麼最後一次編輯增加了邏輯沒有辦法。 「_falsy_」比「false」更普遍,這就是爲什麼我沒有立即回答它的原因。 –

2
quarters.q1 == quarters.q2 == quarters.q3 == quarters.q4 == false 

true == quarters.q3 == quarters.q4 == false 

false == quarters.q4 == false 

true == false 

什麼你基本上做的是這個

一切都將執行從左至右,除非您設置的順序(與()

你可以走這條路吧

function get_bool(quarters){ 
for(k in quarters) 
{ 
    if(quarters[k] != false) 
    { 
    return true; 
    } 
} 
return false; 
}