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

Does javascript use optimization in boolean expressions?

本文关键字:优化 布尔表达式 javascript      更新时间:2023-09-26

当我决定用经典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失败,则不再调用

passwordCheck。

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

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

这是javascript引擎的正常行为吗?

是的,这很正常。它被称为短路求值,既方便又非常常见(即存在于许多语言中(C, c++, Java, Perl,许多其他语言),而不仅仅是JavaScript)。

应该是这样的!

引自维基百科:逻辑连接(又名&&)如果的两个操作数都为真,则结果为真,否则为假。
换句话说,如果第一个操作数为假,则无需继续计算第二个操作数,因为结果始终为假。

所以像 这样的表达式
if(condition1 && condition2)

等价于

if(condition1){
    if(condition2){
    }
}

因此,如果第一个条件为假,则不需要继续计算表达式,因为答案将保持不变。

如果要显式运行两个函数,则可以选择仅在两个函数都求值时运行&&:

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