阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      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 权威指南)

      卖前端学习教程

      只需几十元,就能买到培训班的内部教程!开启高薪之路!

      零基础小白阿里P7的教程都有!

      同时长期收购所有培训班的前端教程

      目录
      本文目录
      目录