Which Logic Operator Takes Precedence

ε祈祈猫儿з 提交于 2019-11-26 22:31:51

My rule of thumb, which covers basically 99% of all use cases for conditional statements, is:

  1. Grouping: ()
  2. Member access . or [...]
  3. Not: !
  4. Comparison, e.g. < , >= , === , !=, ...
  5. Logical AND &&
  6. Logical OR ||

MDN gives you the exhaustive breakdown: Javascript Operator Precedence

so for your example:

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

equals

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

For anything more complex than the above mentioned cases I would look into refactoring the code for readabilities sake anyways!

There is a pretty good rule of thumb to this. Think of these operators as of mathematical ones:

  • AND is multiplication (eg. 0 * 1 = 0 => FALSE)
  • OR is adding (eg. 0 + 1 = 1 => TRUE)

When you remember this, all you have to know is that multiplication always comes before addition.

See this chart for precedence.

I'm not going to explain what happens because the next guy reading your code will think: "WTF? Does that do what it should?"

So the better solution is to wrap the terms in parentheses even if you know the precedence, applied it correctly and the code works

This follows the old wisdom that you shouldn't do everything you can just because you can do it. Always keep an eye on the consequences.

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

&& is before ||, so your expression is equivalent to:

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

It will be the first:

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

As a general rule in most programming languages AND has higher precedence

While Logical Operator Precedence is not actually defined in the ECMAScript Specification, MDN does a pretty good job of it and even has a separate page for Logical Operators.

My concern I suppose, since Logical Operator Precedence is not actually defined in the ECMAScript Specification, each individual browser vendor can potentially be different (I'm talking to you, Internet Explorer!) so YMMV.

In the event anyone wants to test this across different browsers, here's a test case fiddle: http://jsfiddle.net/HdzXq/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!