扩展运算符

与剩余参数关联最密切的就是扩展运算符。剩余参数允许你把多个独立的参数合并到一个数组中;而扩展运算符则允许将一个数组分割,并将各个项作为分离的参数传给函数。考虑一下 Math.max() 方法,它接受任意数量的参数,并会返回其中的最大值。这里有个此方法的简单用例:

let value1 = 25,
    value2 = 50;

console.log(Math.max(value1, value2));      // 50

若像本例这样仅处理两个值,那么 Math.max() 非常容易使用:将这两个值传入,就会返回较大的那个。但若想处理数组中的值,此时该如何找到最大值? Math.max() 方法并不允许你传入一个数组,因此在 ES5 或更早版本中,你必须自行搜索整个数组,或像下面这样使用 apply() 方法:

let values = [25, 50, 75, 100]

console.log(Math.max.apply(Math, values));  // 100

该解决方案是可行的,但如此使用 apply() 会让人有一点疑惑,它实际上使用了额外的语法混淆了代码的真实意图。

ES6 的扩展运算符令这种情况变得简单。无须调用 apply(),你可以像使用剩余参数那样在该数组前添加 …​,并直接将其传递给 Math.max()JS 引擎将会将该数组分割为独立参数并把它们传递进去,就像这样:

let values = [25, 50, 75, 100]

// equivalent to
// console.log(Math.max(25, 50, 75, 100));
console.log(Math.max(...values));           // 100

现在调用 Math.max() 看起来更传统一些,并避免了为一个简单数学操作使用复杂的 this 绑定(即在上个例子中提供给 Math.max.apply() 的第一个参数)。

你可以将扩展运算符与其他参数混用。假设你想让 Math.max() 返回的最小值为 0 (以防数组中混入了负值),你可以将参数 0 单独传入,并继续为其他参数使用扩展运算符,正如下例:

let values = [-25, -50, -75, -100]

console.log(Math.max(...values, 0));        // 0

本例中传给 Math.max() 的最后一个参数是 0,它跟在使用扩展运算符的其他参数之后传入。

用扩展运算符传递参数,使得更容易将数组作为函数参数来使用,你会发现在大部分场景中扩展运算符都是 apply() 方法的合适替代品。

除了你至今看到的默认参数与剩余参数的用法之外,在 ES6 中还可以在 JSFunction 构造器中使用这两类参数。