当我决定用经典的javascript构建普通的web表单验证时,我有一个奇怪的错误。输入文本字段有几个“onblur”处理程序和一个“form-submit”处理程序。
当我像这样使用它们时:
function loginCheck() {
... return true of false
}
function passwordCheck() {
...
}
function formValidation() {
return loginCheck() && passwordCheck();
}
它无法正常工作:如果loginCheck失败,“passwordCheck”从未调用过!
最后我有解决方法
function formValidation() {
ok = loginCheck();
ok &= passwordCheck();
return ok;
}
现在执行密码检查。但是当我选择时:
function formValidation() {
ok = loginCheck();
ok = ok && passwordCheck();
return ok;
}
如果loginCheck失败,则永远不会再次调用此外:loginCheck& passwordCheck返回布尔值,但& =运算符将其转换为“0”或“1”。 “0”对我的onsubmit="return checkForm"
处理程序不起作用。我必须再次将我的& =结果转换为布尔值:
function formValidation() {
ok = loginCheck();
ok &= passwordCheck();
return ok != 0;
}
这是javascript引擎的正常行为吗?
答案 0 :(得分:6)
是的,这很正常。它被称为short-circuit evaluation并且非常方便(即存在于许多语言中(C,C ++,Java,Perl,许多其他语言),而不仅仅是JavaScript)。
答案 1 :(得分:2)
这就是应该的样子!
引自wikipedia:逻辑连词(又名&&
)“如果其的操作数均为真,则结果为true,否则为false。”
换句话说,如果第一个操作数为false,则无需继续评估第二个操作数,因为结果将始终为false。
所以像
这样的表达式if(condition1 && condition2)
相当于
if(condition1){
if(condition2){
}
}
因此,您会看到如果第一个条件为false,则无需继续评估您的表达式,因为答案将保持不变。
答案 2 :(得分:0)
如果要显式运行这两个函数,则可以选择仅在评估两者时运行&&
:
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