ES5 中的无命名参数
ES6 不定参数
ES6中,在函数的命名参数前添加三个点(...) 就表明这是一个不定参数,该参数为一个数组,包含着自它之后传入的所有参数
通过这个数组可以逐一访问里面的参数。使用不定参数重写pick() 函数
在上述函数中,keys包含的是object之后传入的所有参数(而arguments对象包含的则是所有传入的参数,包括object)
函数的length属性统计的是函数命名参数的数量,不定参数的加入不会影响length属性的值,pick()函数length为1,只有object
不定参数的使用限制
(1)每个函数最多只能声明一个不定参数,而且一定要放在所有参数末尾
(2)不定参数不能用于对象字面量setter之中
对象字面量setter的参数只能为一个
不定参数对arguments对象的影响
不定参数设计的初衷是为了代替JavaScript的arguments对象。起初,在ECMAScript4草案中,arguments对象被移除并添加了不定参数的特性,从而可以传入不限数量的参数
但是ECMAScript4 从未被标准化,这个想法被搁置了。直到重新引入了ECMAScript6 标准,唯一区别是arguments对象依然存在
如果声明函数时定义了不定参数,则在函数被调用时,arguments对象包含了所有传入函数的参数,就像这样:
增强的Function构造函数
上述为通常利用Function构造函数创建函数的方式,接收字符串形式的参数,分别为函数参数和函数体
ES6中支持在创建函数时定义默认参数和不定参数,如下:
也支持不定参数:
展开运算符
Math.max(), 接收任意数量的参数并返回值最大的那个
如果只处理两个值,Math.max()非常简单易用
但是如果想从数组中返回最大值呢,该怎么做呢,难道把数组元素全部一个个写入吗,这不太现实!
ES5 早期版本中,可以使用apply() 方法
这个方案确实可行,但是难看出代码意图
ES6 中使用不定参数就很方便了
可以将展开运算符与其他正常传入的参数混合使用,假如你想限定Math.max() 返回的最小值为0,可以单独传入限定值,如下: