哪个逻辑运算符优先

时间:2012-06-22 14:07:01

标签: javascript if-statement logic operator-precedence

所以,我正在研究在if-else语句中用逻辑运算符编写稍微复杂的操作。我知道我可以做括号,我知道这是更好的方法,但我已经好奇,所以我会问。如果我要做这样的事情:

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

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

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

或者如果'OR'运算符优先,它最终会像:

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

完整的清单会很好,如果你能在某处找到它的操作顺序。谢谢!

7 个答案:

答案 0 :(得分:67)

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

  1. 分组:()
  2. 会员访问. or [...]
  3. 不是:!
  4. 比较,例如< , >= , === , !=, ...
  5. 逻辑AND &&
  6. 逻辑或||
  7. MDN为您提供详尽的细分:Javascript Operator Precedence

    所以你的例子:

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

    等于

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

    对于比上述情况更复杂的事情,我会考虑为可读性重构代码!

答案 1 :(得分:20)

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

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

当你记住这一点时,你必须知道的是,在添加之前,乘法总是

答案 2 :(得分:9)

请参阅this chart for precedence

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

所以更好的解决方案是将术语包含在括号中,即使您知道优先级,正确应用代码也可以

这遵循了一种古老的智慧,即你不应该做所有事情,因为你可以做到。始终关注后果。

答案 3 :(得分:3)

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

&&||之前,因此您的表达式相当于:

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

答案 4 :(得分:1)

这将是第一次:

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

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

答案 5 :(得分:1)

虽然ECMAScript Specification中并未实际定义逻辑运算符优先级,但MDN表现相当不错,甚至还有Logical Operators的单独页面。

我担心,我认为,由于ECMAScript规范中并未实际定义逻辑运算符优先级,因此每个浏览器供应商可能会有所不同(我正在与您通信,Internet Explorer!),因此YMMV。

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

答案 6 :(得分:0)

我知道这是旧帖子,但是我想知道是否应该颠倒顺序。 我一直认为or语句中要求较高的一半应该首先列出,因为它通过的可能性较小:

克里斯托弗的正确回答:

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

实际上应该写成吗?:

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

我觉得您很有可能在第一个示例中甚至都不会进入下半场。

让我知道您的想法。