2011-10-22 31 views
4

当我决定使用经典javascript构建普通的Web表单验证时,出现奇怪的错误。有几个用于输入文本字段的“onblur”处理程序和一个“表单提交”处理程序。JavaScript是否在布尔表达式中使用优化?

当我使用他们喜欢的是:“passwordCheck”如果loginCheck失败从来没有所谓:

function loginCheck() { 
    ... return true of false 
} 

function passwordCheck() { 
    ... 
} 

function formValidation() { 
    return loginCheck() && passwordCheck(); 
} 

,因为我希望它不工作!

最后,我有解决办法

function formValidation() { 
    ok = loginCheck(); 
    ok &= passwordCheck(); 
    return ok; 
} 

现在执行密码检查。但是,当我选择:

function formValidation() { 
     ok = loginCheck(); 
     ok = ok && passwordCheck(); 
     return ok; 
    } 

passwordCheck永远不会再次调用如果loginCheck失败。

此外:loginCheck & passwordCheck返回布尔值,但& =运算符将其转换为“0”或“1”。 “0”对我的onsubmit="return checkForm"处理程序不起作用。我不得不将我& =结果再次布尔:

function formValidation() { 
     ok = loginCheck(); 
     ok &= passwordCheck(); 
     return ok != 0; 
    } 

这是JavaScript引擎一种正常的行为?

+5

'&'是按位与,并将始终返回一个数字。 '&&'是逻辑与,并且将返回表达式的值,它决定了整体结果。将任何值转换为布尔值的快捷方式是使用双重否定'!!'。 –

+0

可以以某种方式改变可怕的标题?我想不出那些清晰而又有吸引力的东西。 – Lekensteyn

+0

如果在登录检查失败后需要进行密码检查,则需要进行一些重构。 – hyperslug

回答

7

是的,这是正常的。它被称为short-circuit evaluation,既方便又很常见(即以很多语言(C,C++,Java,Perl,许多其他语言),而不仅仅是JavaScript)。

+0

多么愚蠢的我:) –

1

如果你想明确地运行这两个功能,您可以选择只有当被评估运行&&

var l = loginCheck(), // will evaluate 
    p = passwordCheck(); // will evaluate 

return l && p;   // if l failed, p will be ignored, but both functions 
         // have been evaluated anyway 
+0

'return loginCheck()| passwordCheck();'在同一行中做同样的事情,但在这种情况下,为什么你要做密码检查,如果登录失败是一个谜。 – EJP

+0

@EJP:是的,但后来又返回一个数字。我只是把它作为复杂的'&='方式的替代品。 – pimvdb

+0

@EJP因为我的支票编码器UI。我想向用户显示当前错误 –

2

这是事情应该是这样!

wikipedia

引用:所述逻辑与(又名&&)“导致真,如果两个其操作数都为真,假否则值”。
换句话说,如果第一个操作数为假,则不需要继续评估第二个操作数,因为结果始终为假。

所以像

if(condition1 && condition2) 

表达式相当于

if(condition1){ 
    if(condition2){ 

    } 
} 

所以你看,如果第一个条件是假的,就没有必要继续评估你的表现,因为答案保持不变。