Spread操作符(...),也称作展开操作符,作用是将可迭代的(Iterable)对象进行展开。
比如有2个数组,我们要将其中一个数组中所有元素插入到另一个数组中,通过Spread操作符,就可以这样进行:
var fruits = ["apple", "orange", "peach"];
var shoppingList = ["t-shirt", ...fruits, "egg"];
// shoppingList的值:["t-shirt", "apple", "organe", "peach", "egg"]
我们看到,通过在shoppingList中使用Spread操作符对fruits数组进行展开,就可以轻松的将fruits数组元素变成shoppingList中的数组元素,非常简单。如果不用Spread操作符,我们也可以通过循环数组并建新数组的方式来实现,但是明显会复杂的多。
另一个常见的场景是在函数调用传参的时候:
function testFunc(x, y, z) {
console.log(x, y, z);
}
var args = [10, 15, 20];
testFunc(args); //不正确
testFunc(...args); //正确
我们的testFunc()是一个接受3个参数的函数,而变量args是一个包含了3个元素的数组。如果直接把args作为参数传入testFunc(),肯定是不符合这个函数的设计逻辑的。在这种情况下,使用Spread操作符,就可以把数组中的元素展开并填充这个函数的参数列表,达到理想中的效果。
最后,我们在一开始提到,Spread操作符可以展开Iterable的对象,这样的话,除了数组之外,所有实现了Symbol.iterator的对象,如:Set, Map和Generator等等,都可以使用Spread操作符。
var map = new Map();
map.set("a", 1);
map.set("b", 2);
var arr1 = [...map]; //[["a", 1], ["b", 2]]
var set = new Set();
set.add(1);
set.add(2);
set.add(1);
set.add(3);
var arr2 = [...set]; //[1, 2, 3]
function *myGen() {
yield "hello";
yield "world";
}
var arr2 = [...myGen()]; //["hello", "world"]