所以,我正在研究在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
完整的清单会很好,如果你能在某处找到它的操作顺序。谢谢!
答案 0 :(得分:67)
我的经验法则基本上涵盖条件语句的所有用例的99%:
()
. or [...]
!
< , >= , === , !=, ...
&&
||
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)
我不打算解释会发生什么,因为下一个阅读你代码的人会想:“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))
我觉得您很有可能在第一个示例中甚至都不会进入下半场。
让我知道您的想法。