【问题标题】:Complex IF statement issue复杂的 IF 语句问题
【发布时间】:2017-05-28 22:11:22
【问题描述】:

if 语句中有一个复杂的条件,不知怎的,它并没有达到我想要的效果。

if (
    (statementA1) ||
    (statementA2) &&
    (statementB) &&
    (statementC)
) {
    doSomething
}

A1 和 A2 不能同时为真(因为实际语句的性质)。 此外,B 和 C 都必须评估为 true 才能得出整体为 true。 所以只有true false true true 和false true true true 应该返回true;任何其他排列都应返回false。

由于其内部复杂性,这些语句用大括号括起来(包括 Math.abs()、A1 和 B 具有内部组合子语句)。

【问题讨论】:

  • 如果运算符优先级对您来说很困难,您总是可以将一个 if 块拆分为多个嵌套的。但是,是的,逻辑 AND 的优先级高于 OR。
  • a || b && c 解析为a || (b && c)。
  • 它并不太复杂,我只是太专注于这个问题(本周重写了相同的 feauter 3 次),目前我周围没有人可以讨论它。它本身就很恶心,里面没有嵌套任何东西。
  • 为什么不直接阅读the documentation?顺便说一句,当你说 *A1 和 A1 不能同时为真”时,我假设你的意思是 永远不会,而不是 一定不能保持的条件,对吧?
  • 换句话说,你是说true true true true永远不会发生,还是说它可能发生,如果是,应该返回false(或true)?

标签: javascript node.js if-statement conditional


【解决方案1】:

请记住首字母缩略词“请原谅我亲爱的莎莉阿姨”或 PEMDAS,它指的是括号、指数、乘法/除法和加法/减法。在包括 JavaScript 在内的许多语言中,这是从高(紧)到低(松)的优先顺序。

一个变体是“请原谅我的阿姨”(PEMA)。

然后请记住,在逻辑世界中,and 有点像乘法,or 有点像加法。这样你就可以记住 and (&&) 的绑定比 or (||) 更紧密。

因此,如果你想把and两个条件加在一起,其中一个本身就是or'ing两个条件,你必须给后者加上括号:

a && (b || c)

如果没有括号,它将被解释为

(a && b) || c

当然,在您的特定情况下,您只需编写即可避免担心优先级和括号

a1 != a2 && b && c

【讨论】:

    【解决方案2】:

    对于

      a1    a2    b     c   result
    ----- ----- ----- ----- ------
    true  false true  true  true
    false true  true  true  true
    true  true  true  true  true  <- different from blow
    

    你可以使用这个表达式

    (a1 || a2) && b && c
    

    a1 或 a2 和 b 和 c。

    if ((statementA1 || statementA2) && statementB && statementC) {
        // doSomething
    }
    

    您需要括号,因为logical AND &amp;&amp; (6) 的 operator precedence 超过 logical OR || (5)

    如果有的话

      a1    a2    b     c   result
    ----- ----- ----- ----- ------
    true  false true  true  true
    false true  true  true  true
    true  true  true  true  false <- different from above
    

    那么你可以使用这个表达式

    (!a1 && a2 || a1 && !a2) && b && c
    

    分别检查a1 和a2。

    if ((!statementA1 && statementA2 || statementA1 && !statementA2) && statementB && statementC) {
        // doSomething
    }
    

    【讨论】:

    • A1 部分和 A2 完全引用相同的对象属性,其中包含一个字符串,这就是背后的逻辑。但是我已经用 nina 的解决方案进行了测试,它给了我正确的结果。我希望在这里说谢谢不会有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多