javascript是否在布尔表达式中使用优化?

时间:2011-10-22 10:12:47

标签: javascript

当我决定用经典的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引擎的正常行为吗?

3 个答案:

答案 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