哪个逻辑运算符优先

JTA*_*pps 48 javascript logic if-statement operator-precedence

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

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) {
//Do something
} else {
//Do something else
}
Run Code Online (Sandbox Code Playgroud)

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

firstRun == true || (selectedCategory != undefined && selectedState != undefined)
Run Code Online (Sandbox Code Playgroud)

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

(firstRun == true || selectedCategory != undefined) && selectedState != undefined
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*oph 68

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

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

MDN为您提供详尽的细分:Javascript运算符优先级

所以对你的例子:

(firstRun == true || selectedCategory != undefined && selectedState != undefined)
Run Code Online (Sandbox Code Playgroud)

等于

(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))
Run Code Online (Sandbox Code Playgroud)

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

  • @chharvey号`new`实际上运行的优先级低于`.`(点运算符),这意味着`new Foo().bar()=== new(Foo(..bar())`.当尝试使用抛出错误的"new Date.toLocaleString()"格式化当前时间时,这是非常明显的.相反,必须使用`(new Date).toLocaleString()`或完全不同的东西,如`Date.now()`. (2认同)

Mic*_*zyk 21

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

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

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

  • 这实际上是一个非常好的助记符,无论是在优先级还是结果位的值方面! (3认同)

Aar*_*lla 9

请参阅此图表以获取优先顺序.

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

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

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