es6解構(gòu)賦值 [a,b] = [b,a]的幾個問題
相比于傳統(tǒng)方法需要一個額外變量來進行值交換,使用解構(gòu)進行值交換十分方便。但是我想到幾個問題:
1、解構(gòu)賦值有沒有節(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)賦值的過程應當為
以從左到右的順序計算右側(cè)數(shù)組的值,得到數(shù)組 以從左到右的順序,將右側(cè)數(shù)組的值賦給左側(cè)
可以看到解構(gòu)復制的過程中會有一個包含兩個元素的臨時數(shù)組,并沒有比傳統(tǒng)方法節(jié)省空間,甚至空間會比傳統(tǒng)方法更多一個 int 值大小的空間。
2、解構(gòu)賦值有沒有更快呢?
話不多講,直接上代碼:
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)交換值的速度更慢。按照常理猜測一下,可能是解構(gòu)賦值需要申請臨時數(shù)組,然后遍歷數(shù)組對等號左側(cè)的變量進行賦值,在此期間還需要檢測數(shù)組元素是否為 undefined,這一過程較為費時。
3、一個有趣(撓頭)的發(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)操作更多,應當耗時更多,結(jié)果卻是在公司 mbp 上運行,前者耗時顯著更少,在個人 windows 電腦上運行,二者耗時幾乎一致。經(jīng)過分析只知道可能與 JIT 有關(guān),卻不知道具體原因。希望有大佬可以為萌新解惑呀~
評論
圖片
表情
