逻辑或与优先级

时间:2018-09-10 17:44:48

标签: javascript

我刚刚看过一个教程,其中讨论了以下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新手。这是一个错误还是我误会了所讲的内容?

2 个答案:

答案 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进行求值,如果这是真实的,则整个表达式将是真实的,否则它将是错误的。