首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >逻辑OR和优先级

逻辑OR和优先级
EN

Stack Overflow用户
提问于 2018-09-10 17:44:47
回答 2查看 56关注 0票数 1

我刚刚看了一篇教程,其中谈到了以下if声明:

代码语言:javascript
运行
复制
var a = 0;
if(a || a === 0){...};

它指出,运算符优先级意味着首先对a === 0进行计算,因为它的优先级要高于回收器。

我对此没有真正的异议,但教程接着说,“a”会被评估--但肯定是短路了?

我知道这应该很简单,但我对JS并不熟悉。这是个错误还是我误解了他们说的话?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-10 17:49:16

你可以很容易地用一个吸气器来测试它。如果a为真,则只调用一次getter,这意味着obj.a === 0不会因为短路而被计算:

代码语言:javascript
运行
复制
let obj =  {
    get a() {
        console.log("getting a")
        return true
    }
}
if(obj.a || obj.a === 0){
    console.log("true")
};

如果aa id 0时的情况,则对双方进行评估:

代码语言:javascript
运行
复制
let obj =  {
    get a() {
        console.log("getting a")
        return 0
    }
}
if(obj.a || obj.a === 0){
    console.log("true")
};

票数 4
EN

Stack Overflow用户

发布于 2018-09-10 17:50:58

不,对等不是先发生的:

代码语言:javascript
运行
复制
var a = 0;
if(a || a === 0){...}

本例中的a是falsey,因此||继续到下一个语句,相当于:

代码语言:javascript
运行
复制
if(a === 0){...}

此时,等效发生,显然是true,不发生短路,因为表达式是从左到右计算的。

原因是OR的任何一方都是不同的表达式,表达式是从左到右计算的。

代码语言:javascript
运行
复制
expr1 || expr2

一旦expr1被评估,如果它是真实的,那么短路就会发生,并且这个表达式作为一个整体是真实的。如果不是这种情况,expr2将被评估,如果这是真实的,那么表达式作为一个整体将是真实的,否则它将是假的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52262950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档