【问题标题】:Which Logic Operator Takes Precedence哪个逻辑运算符优先
【发布时间】:2012-06-24 20:20:59
【问题描述】:

所以,我正在考虑在 if-else 语句中使用逻辑运算符编写稍微复杂的操作。我知道我可以做括号,而且我知道这是更好的方法,但我很好奇,所以我要问。如果我要这样做:

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) {
//Do something
} else {
//Do something else
}

不使用括号将如何操作?我知道逻辑运算符有一个操作顺序,类似于 PEMDAS,对吧?我很好奇它是否会像这样运行:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)

或者如果“或”运算符优先,它最终会变成这样:

(firstRun == true || selectedCategory != undefined) && selectedState != undefined

如果你能在某个地方找到完整的列表,那么它的操作顺序会很好。谢谢!

【问题讨论】:

    标签: javascript if-statement logic operator-precedence


    【解决方案1】:

    我的经验法则(基本上涵盖了条件语句所有用例的 99%)是:

    1. 分组:()
    2. 会员访问. or [...]
    3. 不是:!
    4. 比较,例如< , >= , === , !=, ...
    5. 逻辑与&&
    6. 逻辑或||

    MDN 为您提供详尽的细分:Javascript Operator Precedence

    所以你的例子:

    (firstRun == true || selectedCategory != undefined && selectedState != undefined)
    

    等于

    (firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))
    

    对于比上述情况更复杂的情况,无论如何我都会考虑重构代码以提高可读性!

    【讨论】:

    • new 怎么样?它与成员访问和函数调用具有相同的优先级,所以我认为这意味着从左到右? new Foo().bar() 等价于(new Foo()).bar()?而new Foo()(3) 等价于(new Foo())(3)?
    • @chharvey No. new 实际上运行的优先级低于.(点运算符),这意味着new Foo().bar() === new (Foo().bar())。当尝试使用new Date.toLocaleString() 格式化当前时间时,这非常明显,这会引发错误。相反,必须使用(new Date).toLocaleString() 或完全不同的东西,例如Date.now()
    【解决方案2】:

    这有一个很好的经验法则。将这些运算符视为数学运算符:

    • AND 是乘法(例如0 * 1 = 0 => FALSE
    • OR 正在添加(例如0 + 1 = 1 => TRUE

    当您记住这一点时,您只需要知道乘法总是在加法之前发生。

    【讨论】:

    • 这实际上是一个非常好的助记符,无论是优先级还是结果位的值!
    【解决方案3】:

    this chart for precedence

    我不打算解释会发生什么,因为下一个阅读您的代码的人会想:“WTF?这样做是应该的吗?”

    因此,更好的解决方案是将术语括在括号中即使您知道优先级,正确应用它并且代码有效

    这遵循了一个古老的智慧,即你不应该仅仅因为你能做到就去做你能做的一切。时刻关注后果。

    【讨论】:

    • 是的,我明白你在说什么,而且我知道,问我的目的更多的是个人知识。谢谢
    【解决方案4】:

    https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence

    &&|| 之前,所以你的表达式相当于:

    firstRun == true || (selectedCategory != undefined && selectedState != undefined)
    

    【讨论】:

      【解决方案5】:

      这将是第一个:

      firstRun == true || (selectedCategory != undefined && selectedState != undefined)
      

      作为大多数编程语言的一般规则,并且具有更高的优先级

      【讨论】:

        【解决方案6】:

        虽然ECMAScript Specification 中实际上没有定义逻辑运算符优先级,但MDN 做得很好,甚至为Logical Operators 提供了一个单独的页面。

        我想我担心的是,由于 ECMAScript 规范中实际上并未定义逻辑运算符优先级,因此每个单独的浏览器供应商可能会有所不同(我说的是 Internet Explorer!)所以 YMMV。

        如果有人想在不同的浏览器上进行测试,这里有一个测试用例小提琴:http://jsfiddle.net/HdzXq/

        【讨论】:

          【解决方案7】:

          我知道这是一篇旧帖子,但我想知道是否应该颠倒顺序。 我一直认为 or 语句中要求较高的一半应该放在最前面,因为它不太可能通过:

          克里斯托夫的正确回应:

          (firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))

          真的应该写成这样吗?:

          ((selectedCategory != undefined) && (selectedState != undefined) || firstRun == true))

          我觉得在第一个例子中你很有可能永远不会进入下半场。

          让我知道你的想法。

          【讨论】:

          • no: a) firstRun 只存在一次,这意味着任何可能性都较小,并且永远不会发生。 b) 因为要求更高,嗯,要求更高。如果检查要求不高的条件所需的时间减少 10 倍,那么可能性是否会降低也没关系
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          • 2018-12-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多