<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          es6解構(gòu)賦值 [a,b] = [b,a]的幾個(gè)問(wèn)題

          共 2135字,需瀏覽 5分鐘

           ·

          2021-08-16 12:14

          相比于傳統(tǒng)方法需要一個(gè)額外變量來(lái)進(jìn)行值交換,使用解構(gòu)進(jìn)行值交換十分方便。但是我想到幾個(gè)問(wèn)題:

          1、解構(gòu)賦值有沒(méi)有節(jié)省空間呢?

          // 傳統(tǒng)

          let c = b;

          b = a;

          a = c;

          // 解構(gòu)

          [a, b] = [b, a];

          首先思考如下操作:

          let a = 1, b = 2;

          [a, b] = [b=a, a=3];//1 3

          可以分析出解構(gòu)賦值的過(guò)程應(yīng)當(dāng)為

          1. 以從左到右的順序計(jì)算右側(cè)數(shù)組的值,得到數(shù)組
          2. 以從左到右的順序,將右側(cè)數(shù)組的值賦給左側(cè)

          可以看到解構(gòu)復(fù)制的過(guò)程中會(huì)有一個(gè)包含兩個(gè)元素的臨時(shí)數(shù)組,并沒(méi)有比傳統(tǒng)方法節(jié)省空間,甚至空間會(huì)比傳統(tǒng)方法更多一個(gè) int 值大小的空間。

          2、解構(gòu)賦值有沒(méi)有更快呢?

          話不多講,直接上代碼:

          const times = 3000000000;

          let a = 1, b = 2;

          let time1 = new Date().getTime();

          while (i++ < times) {

            [a, b] = [b, a];

            let c = b;

            b = a;

            a = c;

            let d = b;

            b = a;

            a = d;

          }

          console.log(new Date().getTime() - time1); // 4300左右

          time1 = new Date().getTime();

          while (i-- >= 0) {

            [a, b] = [b, a];

            [a, b] = [b, a];

            let c = b;

            b = a;

            a = c;

          }

          console.log(new Date().getTime() - time1); // 6400左右

          可以看到,解構(gòu)交換值的速度更慢。按照常理猜測(cè)一下,可能是解構(gòu)賦值需要申請(qǐng)臨時(shí)數(shù)組,然后遍歷數(shù)組對(duì)等號(hào)左側(cè)的變量進(jìn)行賦值,在此期間還需要檢測(cè)數(shù)組元素是否為 undefined,這一過(guò)程較為費(fèi)時(shí)。

          3、一個(gè)有趣(撓頭)的發(fā)現(xiàn)

          while (i++ < times) {

            [a, b] = [b, a];

            [a, b] = [b, a];

            let c = b;

            b = a;

            a = c;

          }

          while (i++ < times) {

            [a, b] = [b, a];

            [a, b] = [b, a];

          }

          肉眼觀察,上面的循環(huán)內(nèi)操作更多,應(yīng)當(dāng)耗時(shí)更多,結(jié)果卻是在公司 mbp 上運(yùn)行,前者耗時(shí)顯著更少,在個(gè)人 windows 電腦上運(yùn)行,二者耗時(shí)幾乎一致。經(jīng)過(guò)分析只知道可能與 JIT 有關(guān),卻不知道具體原因。希望有大佬可以為萌新解惑呀~

          這是一條招聘廣告

          字節(jié)跳動(dòng)電商業(yè)務(wù)崗位多多!

          HC多多!你想投遞的我們都有,快來(lái)找我內(nèi)推吧!        

          投遞鏈接:https://job.toutiao.com/s/ewyX4Dg

          郵箱:[email protected]


          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码插入大大大大 | 夜夜操夜夜爱 | 91操操干| 狠狠撸在线视频 | 九一免费网站 |