2015-12-02 86 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; 
}