【问题标题】:Does javascript use optimization in boolean expressions? [duplicate]javascript 是否在布尔表达式中使用优化? [复制]
【发布时间】:2011-12-13 02:43:42
【问题描述】:

当我决定使用经典的 javascript 构建普通的 web 表单验证时,我遇到了奇怪的错误。输入文本字段有几个“onblur”处理程序和一个“表单提交”处理程序。

当我这样使用它们时:

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 引擎的正常行为吗?

【问题讨论】:

  • & 是按位与并且总是返回一个数字。 && 是逻辑与,将返回决定总体结果的表达式的值。将任何值转换为其等效布尔值的捷径是使用双重否定 !!
  • 能以某种方式改变可怕的标题吗?我想不出什么清晰且仍然有吸引力的东西。
  • 如果在登录检查失败后需要进行密码检查,则需要进行一些重构。

标签: javascript


【解决方案1】:

应该是这样的!

引用wikipedia :逻辑连词(又名&&)“如果两个操作数都为真,则结果为真,否则为假。”
换句话说,如果第一个操作数为假,则无需继续计算第二个操作数,因为结果将始终为假。

所以像

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

等价于

if(condition1){
    if(condition2){

    }
}

所以您看到如果第一个条件为假,则无需继续评估您的表达式,因为答案将保持不变。

【讨论】:

    【解决方案2】:

    如果你想显式运行这两个函数,你可以选择只在两个函数都被评估后运行&&

    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
    

    【讨论】:

    • return loginCheck() | passwordCheck(); 在一行中做同样的事情,但在这种情况下,如果登录失败,您为什么要进行密码检查是一个谜。
    • @EJP:是的,但又一次返回一个数字。我只是将其发布为复杂的&= 方式的替代方法。
    • @EJP 因为我的检查重读了 UI。我想向用户显示当前错误
    • @pimvdb OP'2 的两个方法都返回布尔值,所以这一行也返回一个布尔值。如果方法返回一个数字,它会返回一个数字。
    • @EJP:不完全是。 (true | false) === 1.
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2015-02-14
      • 2016-07-13
      • 2016-02-20
      相关资源
      最近更新 更多