2015-12-02 2 views
-3

я следующий объект:Javascript Синтаксис - если заявление

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

Мой вопрос, почему следующий ПЧ возвращает истину?

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' is' true', 'true == false' is' false', 'false == false' is' true' ... вы можете понять это с помощью ручкой и бумагой. – deceze

+0

Я просто исправил опечатки – TBE

ответ

10

Почему следующий IF возвращается true?

Предполагая toppingOrder является quarters, позволяет заполнить его и посмотреть, что мы имеем

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, например используя логическое НЕ !

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_ так же просто, как и логика, поэтому последнее изменение добавило логический путь. Быть _falsy_ более общим, чем быть «ложным», поэтому я не сразу ответил на него. –

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; 
} 
Смежные вопросы