ES6 加入了新的運算子...
Spread Operator,簡化了展開陣列的過程,應用上真的非常廣,像是取值、複製、合併、轉換型態、取代舊式 API…等等,這些都改善或簡化了 JavaScript 的邏輯程序,讓程式有了更多元的發展。
概念與用途
- 主要是展開單一個陣列 array,轉化為多個逗點隔開的獨立參數
- 此運算子由三個點
...
組成,後面再加上你要轉換的陣列
1 2 3 4 5 6 7
| let spread = [1, 2, 3];
console.log(...spread); console.log(...['a', 'b']);
console.log(1, 2, 3); console.log('a', 'b');
|
- 主要是用在執行函數時的參數列上
- 所以可以直接取代函數的
apply()
方法
1 2 3 4 5 6 7 8
| function foo(a, b, c) { console.log(a + b + c); } let arr = [10, 20, 30];
foo(...arr);
foo.apply(null, arr);
|
使用特性
1 2 3 4
| let a1 = ['x', 'y']; let a2 = ['w', ...a1, 'z'];
console.log(a2);
|
1 2 3 4
| let a1 = [1, 2]; let a2 = [...a1];
console.log(a2);
|
1 2 3 4 5 6 7 8
| let a1 = ['Hello', 'world']; let a2 = [1, 2, 3]; a2 = [...a2, ...a1];
console.log(a2);
a2 = a2.concat(a1);
|
1 2
| let text = [...'Hello']; console.log(text);
|
使用在物件上
1 2 3 4 5 6 7 8 9 10 11 12
| let obj1 = { name: 'foo', x: 10 }; let obj2 = { name: 'test', y: 20 };
let clonedObj = { ...obj1 }; console.log(clonedObj);
let mergedObj = { ...obj1, ...obj2 }; console.log(mergedObj);
|
其他應用
1 2 3 4 5 6 7
| let list = [1, 2]; list.push(...[3, 4]);
console.log(list);
list.push.apply(list, [3, 4]);
|
- 使用在 JavaScript 的自訂日期 Date 物件
1 2 3 4 5
| let today = new Date(...[2018, 1, 1]);
let today = new (Date.bind.apply(Date, [null, 2018, 1, 1]));
console.log(today);
|
1 2 3 4 5 6 7
|
const nodeData = document.querySelectorAll('body'); const arrayData = [...nodeData];
console.log(nodeData); console.log(arrayData);
|
這個...
擴展運算子與 ES6 中另一個新加入的 Rest 參數看起來很相似,但它們卻是相反的關係,下次的主題將會來解說到~