# 五、扩展参数处理 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 运算符!