应用于函数调用的展开(Spread)运算符。这玩意儿跟Nutella没半毛钱关系,即使Nutella打开之后口感非常棒(译者注:Nutella是一个巧克力酱品牌,其广告语中使用的spread一词深入人心)。但它的确是一个美味的特性,我想你会喜欢它的。
在文章《深入浅出ES6(五):不定参数和默认参数》中,我们介绍了不定参数(Rest),通过这种方式声明的函数可以接受任意数量的参数,相对于之前传递随机而又略显笨拙的arguments对象而言,这显然是一种更为优雅的选择。
function log(...stuff) { // stuff是不定参数。
var rendered = stuff.map(renderStuff); // 它实际上是一个数组
$("#log").add($(rendered));
}
其实还有另外一种匹配语法,可以用这种语法给函数传递任意数量的参数,可以让fn.apply()函数看起来更优雅:
// 记录数组中的所有值
log(...myArray);
展开运算符适用于所有可迭代对象,所以你可以用log(...mySet)将所有的内容记录在一个Set中。
与不定参数不同的是,你可以在同一个参数列表中多次使用展开操作符:
// kicks在trids之前
log("Kicks:", ...kicks, "Trids:", ...trids);
展开运算符也可以让多维数组展开变得不再复杂:
> var smallArrays = [[], ["one"], ["two", "twos"]];
> var oneBigArray = [].concat(...smallArrays);
> oneBigArray
["one", "two", "twos"]
...但也可能只有我有这个迫切的需求。如果真的是这样,那还是去责备Haskell好啦。
应用于构建数组的展开运算符。在另外一篇文章《深入浅出ES6(六):解构 Destructuring》中,我们还讨论了如何将解构改造为“不定(rest)”模式。你可以通过这种方法从数组中取出任意数量的元素。
> var [head, ...tail] = [1, 2, 3, 4];
> head
1
> tail
[2, 3, 4]
你猜怎么着!这儿还有一种匹配语法可以将任意数量的元素整合到数组中:
> var reunited = [head, ...tail];
> reunited
[1, 2, 3, 4]
此处所有的规则与应用于函数调用的展开运算符完全相同,也就是说,在相同的数组中你也可以使用多次展开运算符,等等。