ES6学习笔记-不定参数和默认参数

Author Avatar
Splendour 12月 06, 2015

不定参数

可变参数

构造 API 时,我们通常需要可变参数。String.prototype.concat方法可以接受任意数量的字符串参数。

var hello = 'Hello, ';
console.log(hello.concat('Kevin', ' have a nice day.'));
/* Hello, Kevin have a nice day. */

实现一个函数 containAll,用来检查一个字符串中是否包含若干个字串:

containsAll("banana", "b", "nan") = true;
containsAll("banana", "c", "nan") = false;

传统方法

function containsAll(string) {
  for (var i = 1; i < arguments.length; i ++) {
    var item = arguments[i];
    if (string.indexOf(item) === -1) {
      return false;
    }
  }
  return true;
}
  • argument 对象是一个类数组对象,其中包含了传递给函数的所有参数。
  • 这个实现的可读性较差,而且迭代必须从1开始,容易掉坑,当添加一个参数时,又得同步更新循环体中的迭代初始值。

ES6实现

function containsAll(string, ...items) {
  for (let item of items) {
    if (string.indexOf(item) === -1) {
      return false;
    }
  }
  return true;
}
  • ...items 是不定参数的语法,传递给函数的第一个参数赋值给string,传递给函数的其他参数都被放到一个数组中,赋值给items
  • 只有最后一个参数才可以被标记为不定参数,不定参数前的所有参数都正常填充,“额外的”参数才会放到数组中。
  • 若没有额外的参数,不定参数就是一个空数组

默认参数

传统方法

在 Javascript 中,函数调用时,没有被传递到的参数默认为 undefined,需要人工赋予默认值。

function sayHello(person1, person2) {
  var a = person1 || 'Li Lei';
  var b = person2 || 'Han Meimei';
  return a + ' loves ' + b;
}

ES6实现

在 ES6 中,提供了一种新的语法,类似于其他语言,可以指定参数的默认值。

function sayHello(person1 = 'Li Lei', person2 = 'Han Meimei') {
  return `${person1} loves ${person2}`;
}
  • 默认值表达式在函数调用时自左向右求值,也即可以使用参数之前已经填充好的其他参数值。
function sayHello(person1 = 'Li Lei',
  person2 = (person1 == 'Perter') ? 'Lily' : 'Han Meimei') {
    return `${person1} loves ${person2}`;
  }
  • 传递 undefined 等同于不传值
  • 没有默认值的参数隐式默认为 `undefined