在函数命名参数前添加三个点 ... 就表明这是一个不定参数,该参数为一个数组,包含着自它之后传入的所有参数,通过这个数组名即可逐一访问里面的参数。

  1. function pick(object, ...keys) {
  2. let result = Object.create(null);
  3. for (let i = 0, len = keys.length; i< len; i++) {
  4. result[keys[i]] = object[keys[i]];
  5. }
  6. return result;
  7. }

不定参数 keys 包含的是 object 之后传入的所有参数(而 arguments 对象包含的则是所有传入的参数,包含 object)。

tips:函数的 length 属性统计的是函数命名参数的数量,不定参数的加入不会影响 length 属性的值。

使用限制

每个函数最多只能声明一个不定参数,而且一定要放在所有参数的末尾。

  1. function picker(object, ...keys, last) {
  2. // 执行逻辑
  3. }
  4. picker() // 报错

不定参数不能用于对象字面量 setter 之中。

  1. let object = {
  2. // 报错
  3. set name(...value) {
  4. // 执行逻辑
  5. }
  6. }

对象字面量 setter 的参数有且只能有一个。而在不定参数的定义中,参数的数量可以无限多,所以在当前上下文中不允许使用不定参数。