es6 解構賦值 [a-b] - [b-a] 的幾個問題

相比於傳統方法需要一個額外變量來進行值交換,使用解構進行值交換十分方便。但是我想到幾個問題:

1、解構賦值有沒有節省空間呢?

// 傳統

let c = b;

b = a;

a = c;

// 解構

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

首先思考如下操作:

let a = 1, b = 2;

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

可以分析出解構賦值的過程應當爲

  1. 以從左到右的順序計算右側數組的值,得到數組

  2. 以從左到右的順序,將右側數組的值賦給左側

可以看到解構複製的過程中會有一個包含兩個元素的臨時數組,並沒有比傳統方法節省空間,甚至空間會比傳統方法更多一個 int 值大小的空間。

2、解構賦值有沒有更快呢?

話不多講,直接上代碼:

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左右

可以看到,解構交換值的速度更慢。按照常理猜測一下,可能是解構賦值需要申請臨時數組,然後遍歷數組對等號左側的變量進行賦值,在此期間還需要檢測數組元素是否爲 undefined,這一過程較爲費時。

3、一個有趣(撓頭)的發現

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];

}

肉眼觀察,上面的循環內操作更多,應當耗時更多,結果卻是在公司 mbp 上運行,前者耗時顯著更少,在個人 windows 電腦上運行,二者耗時幾乎一致。經過分析只知道可能與 JIT 有關,卻不知道具體原因。希望有大佬可以爲萌新解惑呀~

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/pAQKBNobVdKnI-WDQ_5J3A