哪个逻辑运算符优先

IT技术 javascript if-statement logic operator-precedence
2021-02-14 00:42:35

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

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

6个回答

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

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

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

所以对于你的例子:

(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)?
2021-04-26 00:42:35
@chharvey No.new实际上运行的优先级低于.(点运算符),这意味着new Foo().bar() === new (Foo().bar()). 当试图格式化new Date.toLocaleString()抛出错误的当前时间时,这是非常明显的。相反,必须使用(new Date).toLocaleString()或完全不同的东西,例如Date.now().
2021-04-28 00:42:35

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

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

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

这实际上是一个非常好的助记符,无论是在优先级还是结果位的值方面!
2021-05-10 00:42:35

请参阅此图表以了解优先级

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

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

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

是的,我明白你在说什么,而且我知道,找我的目的更多是为了个人知识。谢谢
2021-05-03 00:42:35

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

&&是 before ||,所以你的表达式等价于:

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

这将是第一个:

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

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