我刚刚看了一篇教程,其中谈到了以下if声明:
var a = 0;
if(a || a === 0){...};
它指出,运算符优先级意味着首先对a === 0
进行计算,因为它的优先级要高于回收器。
我对此没有真正的异议,但教程接着说,“a”会被评估--但肯定是短路了?
我知道这应该很简单,但我对JS并不熟悉。这是个错误还是我误解了他们说的话?
发布于 2018-09-10 17:49:16
你可以很容易地用一个吸气器来测试它。如果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")
};
发布于 2018-09-10 17:50:58
不,对等不是先发生的:
var a = 0;
if(a || a === 0){...}
本例中的a
是falsey,因此||
继续到下一个语句,相当于:
if(a === 0){...}
此时,等效发生,显然是true
,不发生短路,因为表达式是从左到右计算的。
原因是OR的任何一方都是不同的表达式,表达式是从左到右计算的。
expr1 || expr2
一旦expr1
被评估,如果它是真实的,那么短路就会发生,并且这个表达式作为一个整体是真实的。如果不是这种情况,expr2
将被评估,如果这是真实的,那么表达式作为一个整体将是真实的,否则它将是假的。
https://stackoverflow.com/questions/52262950
复制相似问题