2017-02-21 49 views
0

我有一个if语句必须调用函数checkEmpty()为每个条件。if语句检查多个布尔条件

function checkFormFilled(evt){ 
    var isFilled; 
    if(checkEmpty('id1', 'class1') && //condition 1 
     checkEmpty('id2', 'class2') && //condition 2 
     checkEmpty('id3', 'class3') && //condition 3 
     checkEmpty('id4', 'class4')){ //condition 4 
     evt.preventDefault(); 
     isFilled = true; 
    } 
    return isFilled; 
} 

问题是,当条件1为假(前述任一条件为假),跳到evt.preventDefault()行,没有得到调用其他以下checkEmpty()函数。

我想在所有条件返回true时调用evt.preventDefault()。

有没有其他的方法来做到这一点?

+1

这正是你在做什么,是什么问题? – Nicolas

+0

当第一个条件1为false时,它跳转到evt.preventDefault()行。在调用evt.preventDefault()之前,我需要调用所有四个条件。 – haeminish

+0

这是因为AND运算符在第一次错误后关闭。你需要一个OR运算符。 – Nicolas

回答

3

尝试的逻辑运算||这是OR

1

如果条件至少有一个是假,它不会在IF块中去。对于多个& &语句,一旦收到FALSE,将不再检查所有其他成功的& &语句并返回FALSE。

0

它被称为短路。

1-在由& &组成的条件检查中,如果第一个元素的计算结果为false,则将忽略所有其余条件,并为整个条件返回false。

2-在由||组成的条件检查中,如果第一个元素的计算结果为true,则忽略所有其余条件,并在整个条件下返回true。


他编辑了这个问题。这是不正确的。我正在让它成为社区wiki,留在这里。

对此的最佳解决方法是使用||或在您的条件检查中重新排序子条件的顺序以便让其他元素随时得到测试。

1

如果

必须调用函数checkEmpty()为每一个条件。

而且

我想打电话给evt.preventDefault()当所有的条件返回true。

如果您确信checkEmpty()返回一个布尔值,你可以使用bitwise and (&)操作:

function checkEmpty(x) { 
    console.log('checkEmpty called for ' + x); 

    return false; 
} 
if(checkEmpty('..1', '....') & //condition 1 
    checkEmpty('..2', '....') & //condition 2 
    checkEmpty('..3', '....') & //condition 3 
    checkEmpty('..4', '....')){ //condition 4 
    console.log('inside if'); 
} 

输出:

checkEmpty called for ..1 
checkEmpty called for ..2 
checkEmpty called for ..3 
checkEmpty called for ..4 

fiddle demo here

+0

注意:如果'checkEmpty()'可能返回'true'或'false'以外的其他内容,请不要使用'&',因为它是一个按位运算符。例如:'1&10'返回'0',如果它是一个逻辑运算符(这是因为'truthy && truthy'是'true'),这不是你所期望的。 – acdcjunior

+0

OTOH,如果你不知道'checkEmpty()总是返回一个布尔值,你可以加倍否定它们:'if(!! checkEmpty('.. 1','....')&!! checkEmpty ('。2','....')...'(注意在每次'checkEmpty()'调用之前添加'!!')。 – acdcjunior

0

你现在在做什么与链&&运营商说如果所有这些事情都是真的,那么event.preventDefault。如果你真的需要检查每一个条件,并且如果有的话是真的,那么你应该使用逻辑OR运营商||来代替。

0

假设你有一个对象数组,你可以尝试every函数。

var array = []; 
 

 
for (var i = 0; i < 4; i++) 
 
{ 
 
    array.push({ 
 
    id: i, bool: true 
 
    }); 
 
} 
 

 
function check(item) 
 
{ 
 
    return item.bool == true || false; 
 
} 
 

 
if (array.every(check)) 
 
{ 
 
    console.log("all true"); 
 
} 
 
else 
 
{ 
 
    console.log("return false instead"); 
 
} 
 

 

 

 
// Just an example of something that is false 
 
array[1].bool = false; 
 

 
if (!array.every(check)) 
 
{ 
 
    console.log("something is false"); 
 
}