60

因此,我正在考虑在 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

如果您可以在某处找到完整的列表,那么它的操作顺序会很好。谢谢!

4

7 回答 7

83

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

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

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

所以对于你的例子:

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

等于

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

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

于 2012-06-22T14:10:17.057 回答
30

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

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

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

于 2014-12-05T11:30:59.180 回答
11

请参阅此图表了解优先级

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

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

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

于 2012-06-22T14:11:25.720 回答
3

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

&&是 before ||,所以你的表达相当于:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)
于 2012-06-22T14:10:41.283 回答
1

这将是第一个:

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

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

于 2012-06-22T14:11:15.300 回答
1

虽然逻辑运算符优先级实际上并未在ECMAScript 规范中定义,但MDN在这方面做得非常好,甚至为逻辑运算符提供了一个单独的页面。

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

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

于 2012-06-22T15:02:08.830 回答
0

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

克里斯托夫的正确回应:

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

它实际上应该写成吗?:

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

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

让我知道你的想法。

于 2020-03-25T18:11:02.210 回答