擴展運算符(spread)是三個點(...
)。它比如 rest 參數的逆運算,將一個數組轉爲用逗號分隔的參數序列。數組
來看一下差異:數據結構
一、app
二、函數調用函數
function add(x, y) { return x + y; } const numbers = [4, 38]; add(...numbers)
若是說平時咱們傳參,確定是會這樣調用 add(numbers[0],numbers[1])學習
function f(v, w, x, y, z) { } const args = [0, 1]; f(-1, ...args, 2, ...[3]);
使用很是靈活spa
注意,只有函數調用時,擴展運算符才能夠放在圓括號中,不然會報錯。prototype
(...[1, 2]) // Uncaught SyntaxError: Unexpected number console.log((...[1, 2])) // Uncaught SyntaxError: Unexpected number console.log(...[1, 2]) // 1 2
!!替代函數的 apply 方法3d
因爲擴展運算符能夠展開數組,因此再也不須要apply
方法,將數組轉爲函數的參數了。指針
// ES5 的寫法 function f(x, y, z) { // ... } var args = [0, 1, 2]; f.apply(null, args); // ES6的寫法 function f(x, y, z) { // ... } let args = [0, 1, 2]; f(...args);
經過push
函數,將一個數組添加到另外一個數組的尾部。rest
// ES5的 寫法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; Array.prototype.push.apply(arr1, arr2); // ES6 的寫法 let arr1 = [0, 1, 2]; let arr2 = [3, 4, 5]; arr1.push(...arr2);
!擴展運算符的應用
(1)複製數組
數組是複合的數據類型,直接複製的話,只是複製了指向底層數據結構的指針,而不是克隆一個全新的數組
const a1 = [1, 2]; const a2 = a1; a2[0] = 2; a1 // [2, 2]
上面代碼中,a2
並非a1
的克隆,而是指向同一份數據的另外一個指針。修改a2
,會直接致使a1
的變化。
ES5 只能用變通方法來複制數組
const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2]
上面代碼中,a1
會返回原數組的克隆,再修改a2
就不會對a1
產生影響。
擴展運算符提供了複製數組的簡便寫法。
const a1 = [1, 2]; // 寫法一 const a2 = [...a1]; // 寫法二 const [...a2] = a1;
(2)合併數組
擴展運算符提供了數組合並的新寫法。
const arr1 = ['a', 'b']; const arr2 = ['c']; const arr3 = ['d', 'e']; // ES5 的合併數組 arr1.concat(arr2, arr3); // [ 'a', 'b', 'c', 'd', 'e' ] // ES6 的合併數組 [...arr1, ...arr2, ...arr3] // [ 'a', 'b', 'c', 'd', 'e' ]
不過,這兩種方法都是淺拷貝,使用的時候須要注意。
const a1 = [{ foo: 1 }]; const a2 = [{ bar: 2 }]; const a3 = a1.concat(a2); const a4 = [...a1, ...a2]; a3[0] === a1[0] // true a4[0] === a1[0] // true