ES6学习笔记-不定参数和默认参数
不定参数
可变参数
构造 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