我刚刚看过一个教程,其中讨论了以下if语句:
activate application "PKI Client Uninstaller"
tell application "System Events" to tell process "applet"
click menu item "OK" of menu "[Symantec][1] PKI Client Uninstaller" of menu bar 1
click button "OK" of window 1 of window 1
end tell
它指出运算符优先级意味着var a = 0;
if(a || a === 0){...};
首先被评估,因为它的优先级高于||。
我对此没有任何实际问题,但本教程继续说,然后对'a'进行求值-但肯定是短路的吗?
我知道它应该很简单,但是我是JS新手。这是一个错误还是我误会了所讲的内容?
答案 0 :(得分:4)
您可以使用吸气剂轻松地对此进行测试。如果a
为真,则调用一次getter,这意味着obj.a === 0
不会因短路而被评估:
let obj = {
get a() {
console.log("getting a")
return true
}
}
if(obj.a || obj.a === 0){
console.log("true")
};
如果a
为假,如a
id为0
时,则对双方进行评估:
let obj = {
get a() {
console.log("getting a")
return 0
}
}
if(obj.a || obj.a === 0){
console.log("true")
};
答案 1 :(得分:1)
不,不会首先发生对等:
var a = 0;
if(a || a === 0){...}
在这种情况下,a
是假的,因此||
继续到下一条语句,等效于:
if(a === 0){...}
此时,等价发生并且很明显true
,没有短路发生,因为表达式是从左到右求值的。
之所以这样,是因为OR的任一侧都是不同的表达式,并且这些表达式是从左到右求值的。
expr1 || expr2
对expr1
进行一次评估后,如果它是正确的,则只会发生短路,并且整个表达式都是真实的。如果不是这种情况,将对expr2
进行求值,如果这是真实的,则整个表达式将是真实的,否则它将是错误的。