es6學習- 「...」運算符

學習主要來自於阮一峯老師的教程。侵刪。

含義

擴展運算符(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
相關文章
相關標籤/搜索