【问题标题】:If statement using Bitwise AND Operators to force evaluationsIf 语句使用按位与运算符强制求值
【发布时间】:2014-08-13 19:55:41
【问题描述】:

我有几个独立的函数,它们根据其他条件返回真或假。当它们都返回 true 时,我希望发生一个动作,但是我希望所有函数都运行,而不管有多少返回 false。如果我只是想检查所有函数是否返回 true,我会使用:

if (func1() && func2() && func3() ){
    //Some code
}

这样做的问题是,如果其中一个函数返回 false,则右侧的所有函数都不会执行。我以前没有尝试过的一种方法是在 if 表达式中使用按位与运算符 (&),如下所示:

if (func1() & func2() & func3() ){
    //Some code
}

我已经简单地测试了这个方法,它似乎产生了预期的结果,但是我在其他地方找不到这种方法,我想知道是否有任何原因会产生意想不到的结果?

还有一个很好的理由不比较使用这种方法的函数的结果吗?

【问题讨论】:

  • 我最好的猜测是“必须”评估函数才能进行按位比较,否则在发现错误时停止更有效。只要您的返回类型得到检查,我真的看不出有什么问题。
  • 我个人认为依赖这样的副作用是一个有问题的设计决定。它使代码变得脆弱。

标签: javascript if-statement bitwise-operators


【解决方案1】:

这样做的问题是,如果其中一个函数返回 false,则右边的所有函数都不会执行

这不是问题。 if 条件检查真/假,如果使用 && 时传入的值之一是假值,则条件短路并且不会打扰执行其余语句。

这就是&&的全部目的

【讨论】:

  • 我知道这就是 && 的意思。但是在我的脚本中我不想要这种行为。这就是我所说的问题。
  • @Oracle 好吧,我正在回答你问的部分>还有一个很好的理由不使用这种方法比较函数的结果吗?
【解决方案2】:

如果他们只是返回布尔真/假操作,那么它将按预期工作:

if (true & false & true) 

只会是“假”。

但如果他们正在转(比如说)整数,那么你会得到意想不到的结果:

if (10 & 100 & 32)

if (b1010 & b1100100 & b100000)

并评估为假。

【讨论】:

  • 不会正确使用!! 修复整数大小写吗?
【解决方案3】:

只要函数只返回truefalse,使用& 操作符就没有问题。对于特定情况(布尔值作为操作数,整个结果作为布尔值求值),它的工作原理与 && 运算符完全相同,只是不进行短路求值。

(如果函数返回数值 10 也会起作用。这就是 truefalse 值在操作之前转换为的值。)

【讨论】:

    【解决方案4】:

    您可以使用以下内容。

    (func1() || func2() || func3()) && otherAction()
    

    这叫短路。

    【讨论】:

      【解决方案5】:

      如果你想避开按位运算符,你也可以像这样实现它

      const results = [func1(), func2(), func3(), ...funcN())
      
      if (results.every(Boolean)) {
        /* Do something */
      }
      

      【讨论】:

        猜你喜欢
        • 2014-12-28
        • 2015-02-08
        • 2012-12-28
        • 1970-01-01
        • 2013-04-30
        • 2021-08-19
        • 2015-10-22
        相关资源
        最近更新 更多