擴展運算符(spread)是三個點(...
)。它好比 rest 參數的逆運算,將一個數組轉為用逗號分隔的參數序列。
let array = [5,10];
let items = [1,2];
array.push(...items) console.log(array); //[5,10,1,2]
擴展運算符后面還可以放置表達式。
const arr = [ ...(x > 0 ? ['a'] : []), 'b', ];
1.代替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
函數,將一個數組添加到另一個數組的尾部。
// 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);
(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 foo = 'bar'; const baz = {foo}; baz // {foo: "bar"} // 等同於 const baz = {foo: foo};
除了屬性簡寫,方法也可以簡寫。
const o = { method() { return "Hello!"; } }; // 等同於 const o = { method: function() { return "Hello!"; } };
變量的解構賦值用途很多。
(1)交換變量的值
let x = 1; let y = 2; [x, y] = [y, x];
上面代碼交換變量x
和y
的值,這樣的寫法不僅簡潔,而且易讀,語義非常清晰。
(2)從函數返回多個值
函數只能返回一個值,如果要返回多個值,只能將它們放在數組或對象里返回。有了解構賦值,取出這些值就非常方便。
// 返回一個數組 function example() { return [1, 2, 3]; } let [a, b, c] = example(); // 返回一個對象 function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example();
(4)提取 JSON 數據
解構賦值對提取 JSON 對象中的數據,尤其有用。
let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number);
三、編碼風格
解構賦值
使用數組成員對變量賦值時,優先使用解構賦值。
const arr = [1, 2, 3, 4]; // bad const first = arr[0]; const second = arr[1]; // good const [first, second] = arr;
字符串 § ⇧
靜態字符串一律使用單引號或反引號,不使用雙引號。動態字符串使用反引號。
// bad const a = "foobar"; const b = 'foo' + a + 'bar'; // acceptable const c = `foobar`; // good const a = 'foobar'; const b = `foo${a}bar`;
函數的參數如果是對象的成員,優先使用解構賦值。
// bad function getFullName(user) { const firstName = user.firstName; const lastName = user.lastName; } // good function getFullName(obj) { const { firstName, lastName } = obj; } // best function getFullName({ firstName, lastName }) { }