深入浅出ES6(十七):展望未来

1,226 阅读2分钟
  • 应用于函数调用的展开(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]

    此处所有的规则与应用于函数调用的展开运算符完全相同,也就是说,在相同的数组中你也可以使用多次展开运算符,等等。