ES6 的擴展運算符(對象展開符) ...
擴展運算符( spread )是三個點(...)。它好比 rest 參數(shù)的逆運算隆圆,將一個數(shù)組轉為用逗號分隔的參數(shù)序列漱挚。
console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]
該運算符主要用于函數(shù)調用
function push(array, ...items) {
array.push(...items);
}
function add(x, y) {
return x + y;
}
var numbers = [4, 38];
add(...numbers) // 42
上面代碼中,array.push(...items)和add(...numbers)這兩行匾灶,都是函數(shù)的調用棱烂,它們的都使用了擴展運算符租漂。該運算符將一個數(shù)組阶女,變?yōu)閰?shù)序列。
擴展運算符與正常的函數(shù)參數(shù)可以結合使用哩治,非常靈活
function f(v, w, x, y, z) { }
var args = [0, 1];
f(-1, ...args, 2, ...[3]);
擴展運算符的應用
1.合并數(shù)組
擴展運算符提供了數(shù)組合并的新寫法秃踩。
// ES5
[1, 2].concat(more)
// ES6
[1, 2, ...more]
var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];
// ES5 的合并數(shù)組
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6 的合并數(shù)組
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
2.與解構賦值結合
擴展運算符可以與解構賦值結合起來,用于生成數(shù)組
// ES5
a = list[0], rest = list.slice(1)
// ES6
[a, ...rest] = list
下面是另外一些例子业筏。
const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest // [2, 3, 4, 5]
const [first, ...rest] = [];
first // undefined
rest // []:
const [first, ...rest] = ["foo"];
first // "foo"
rest // []
如果將擴展運算符用于數(shù)組賦值憔杨,只能放在參數(shù)的最后一位,否則會報錯蒜胖。
const [...butLast, last] = [1, 2, 3, 4, 5];
// 報錯
const [first, ...middle, last] = [1, 2, 3, 4, 5];
// 報錯
3.函數(shù)的返回值
JavaScript 的函數(shù)只能返回一個值消别,如果需要返回多個值,只能返回數(shù)組或對象台谢。擴展運算符提供了解決這個問題的一種變通方法寻狂。
var dateFields = readDateFields(database);
var d = new Date(...dateFields);
上面代碼從數(shù)據庫取出一行數(shù)據,通過擴展運算符朋沮,直接將其傳入構造函數(shù)Date蛇券。
4.字符串
擴展運算符還可以將字符串轉為真正的數(shù)組。
[...'hello']
// [ "h", "e", "l", "l", "o" ]
JavaScript 會將 32 位 Unicode 字符樊拓,識別為 2 個字符纠亚,采用擴展運算符就沒有這個問題
5.實現(xiàn)了 Iterator 接口的對象
任何 Iterator 接口的對象,都可以用擴展運算符轉為真正的數(shù)組
var nodeList = document.querySelectorAll('div');
var array = [...nodeList];
上面代碼中筋夏,querySelectorAll方法返回的是一個nodeList對象蒂胞。它不是數(shù)組,而是一個類似數(shù)組的對象条篷。這時骗随,擴展運算符可以將其轉為真正的數(shù)組岳瞭,原因就在于NodeList對象實現(xiàn)了 Iterator 接口。
6.Map 和 Set
擴展運算符內部調用的是數(shù)據結構的 Iterator 接口蚊锹,因此只要具有 Iterator 接口的對象瞳筏,都可以使用擴展運算符,比如 Map 結構牡昆。
let map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let arr = [...map.keys()]; // [1, 2, 3]