JavaScript \&& 和 += 运算符优先级问题
   2 分钟阅读

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

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

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<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;

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

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

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

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

(截图出自 JavaScript 权威指南)

本文目录