# 五、扩展参数处理

ES6 中引入的另一组很好的特性是扩展的参数处理。这些提供了一组非常好的习惯用法，使我们非常接近像 C# 或 Java 这样的语言。

默认参数允许您的函数有可选参数，而无需检查`arguments.length`或检查`undefined`。

让我们来看看这可能是什么样子:

代码清单 79

```js
  let greet = (msg = 'hello', name = 'world') =>
  {
    console.log(msg,name);
  }
  greet();
  greet('hey');

```

查看前面的代码，您可以看到我们使用了新的胖箭头(`=>`)语法以及新的`let`关键字。对于这个例子来说，这两者都不是必需的，但是我添加它是为了让您更多地了解新的语法。

运行前面的代码会产生以下结果:

代码清单 80

```js
  hello world
  hey world 

```

在 JavaScript 中，用可变数量的参数处理函数总是很棘手。Rest 参数(…)由三个连续的点字符表示，允许您的函数在不使用`arguments`对象的情况下拥有可变数量的参数。`rest`参数是`Array,`的一个实例，所以所有数组方法都有效。

代码清单 81

```js
  function f(x, ...y) {

  console.log(y);
    // y
  is an Array
    return
  x * y.length;
  }
  console.log(f(3,
  'hello', true)
  === 6);

```

运行前面的代码会产生以下结果:

代码清单 82

```js
  ["hello", true]
  true 

```

您可以有任意多的常规参数，但`rest`参数必须始终是最后一个。这可能是新功能之一，看起来有点陌生和怪异，但随着时间的推移，你会发现这是一个非常好的功能，会派上用场。

`spread`运算符就像休息参数的反义词。它允许您将一个数组扩展成多个形式参数。

代码清单 83

```js
  function add(a, b) {
    return
  a + b;
  }
  let nums = [5, 4];

  console.log(add(...nums));

```

运行前面的代码会产生以下结果:

代码清单 84

```js
  9 

```

同样，这可能看起来很奇怪，但是一旦你开始使用这两者，你会发现它们很有用。

让我们稍微改变一下，在同一个调用中同时有一个常规参数和一个`spread`运算符:

代码清单 85

```js
  function add(a, b) {
    return
  a + b;
  }
  let nums = [4];
  console.log(add(5, ...nums));

```

和前面的例子一样，我们得到了相同的结果:

代码清单 86

```js
  9 

```

让我们再看一个创建数组文字的例子:

代码清单 87

```js
  let a = [2, 3, 4];
  let b = [1, ...a, 5];
  console.log(b);

```

运行前面的代码会产生以下输出:

代码清单 88

```js
  [1, 2, 3, 4, 5] 

```

如您所见，您可以非常有创意地使用 spread 运算符！