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

And*_*rko 3 javascript

当我决定用经典的javascript构建普通的web表单验证时,我有一个奇怪的错误.输入文本字段有几个"onblur"处理程序和一个"form-submit"处理程序.

当我像这样使用它们时:

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

function passwordCheck() { 
   ...
}

function formValidation() {
  return loginCheck() && passwordCheck();
}
Run Code Online (Sandbox Code Playgroud)

它没有像我期望的那样工作:如果loginCheck失败,"passwordCheck"从未调用过!

最后我有解决方法

function formValidation() {
  ok = loginCheck();
  ok &= passwordCheck();
  return ok;
}
Run Code Online (Sandbox Code Playgroud)

现在执行密码检查.但是当我选择时:

function formValidation() {
      ok = loginCheck();
      ok = ok && passwordCheck();
      return ok;
    }
Run Code Online (Sandbox Code Playgroud)

如果loginCheck失败,则不会再次调用passwordCheck.

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

function formValidation() {
      ok = loginCheck();
      ok &= passwordCheck();
      return ok != 0;
    }
Run Code Online (Sandbox Code Playgroud)

这是javascript引擎的正常行为?

Mat*_*Mat 6

是的,这是正常的.它被称为短路评估,既方便又常见(即存在于许多语言(C,C++,Java,Perl,许多其他语言),而不仅仅是JavaScript).