本文目录

JavaScript \&& 和 += 运算符优先级问题

🌙
手机阅读
本文目录结构

在群里看到一个人发的问题;

看着很唬人的,仔细看下,发现是一个关于计算优先级的问题;

var i=4;
if(i+=66&&i++){
    console.log(i);
}

这个题目看着唬人,其实不难的,但是对基础的综合应用还是有帮助的;

实际项目中不会出现这样的代码,但是这背后的运算逻辑却值得一记;

豆芽长的再高,也就是一盘菜;

<script>
    var i=4;
    if(i+=66&&i++){
        console.log(i);//8
    }

    /*
    * i+=66&&i++
    * 1、i+=(66&&i++) ->
    *       66&&i++   ->
    *       true&&i++ -> 注:&&前一个表达式为true时,则取值为&&后面的表达式值
    *       i++       -> 此时i还是为4
    *       4         -> 需要明白i++ 和++i的区别;
    * 2、i+=4
    *    i=i+4
    *    i=4+4
    *    i=8
    * 3、if(i=8){console.log(i);}
    *
    * */
</script>

上面已经写了运算原理;

现在再逐步说明下

1、i+=66&&i++ 这个表达式首先需要明白 && 的优先级是大于+=的,所以可以写为 i+=(66&&i++)

2、 i+=(66&&i++) 中,这里涉及了&&的取值问题,66的布尔值是true,所以是true&&i++,这里还需要明白i++++i的运算区别;一个是先运算后赋值,一个是先赋值后运算;

此时i还是4;所以表达式就是i+=4;

3、i+=4; 这个就比较简单了;就是i=i+4; 也就是i=4+4;结果就是i=8;

4、if(i=8){console.log(i)},这个i=8的表达式在布尔值运算肯定是true;可以手动试试Boolean(i=8) 看看值;

5、结果i的值就是8了;

注意:这里的66是没有任何鸟用的,就是来影响别人思维的;你在这里写为任何一个为 true 的值都不影响结果,比如你写为1000000000也是不影响结果的;

当然如果你把 66 改为 false 的,那结果就不一样了;比如你把 66 该为 0;

var i=4;
if(i+=0&&i++){
    console.log(i);
}

也就是,这时候 i 是 4 了;

另一种情况:如果你把里面的 i++ 改为 ++i; 结果就不是 8,而是 9 了;因为 ++i 是自己先赋值,然后再和别的运算,这点也是需要明白的;

关于不同表达式的优先级,参见下图

(截图出自 JavaScript 权威指南)

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了