avatarGithub

es2015 rest paramters

2016-05-01

Rest parameters

在写API的时候一个常见需求是可变函数(接受任意参数的函数)。String.prototype.concat就是一个可变函数,它可以接受任意个字符串参数。在ES6之前,是通过arguments来实现的。现在,rest parameters提供了一种更好的方法。 为了达到演示效果,来看一个简单的可变函数containsAll,该函数判断一个字符串是否包含多个子字符串。例如,containsAll('banana', 'b', 'nan')返回true,而containsAll('banana', 'c', 'nan')返回false


function containsAll(haystack) {
for (var i = 1; i < arguments.length; i++) {
var needle = arguments[i];
if (haystack.indexOf(needle) === -1) {
return false;
}
}
return true;
}

这种实现确实能够实现我们的功能,但他的可读性并不是很好。函数的只有一个参数haystack,所以你没法一眼看出这个函数接受多个参数。同时,我们在arguments上的遍历也是从1而不是0开始,如果我们需要添加一个参数,那么我们同时也需要更改循环代码。rest parameters解决了这两方面的问题。以下是ES6的实现:


function containsAll(haystack, ...needles) {
for (var needle of needles) {
if (haystack.indexOf(needle) === -1) {
return false;
}
}
return true;
}

当我们调用containsAll('banana', 'b', 'nan')时,haystack就是第一个被传入的参数,即banananeedles前面的省略号即表明该参数为rest参数,所有剩下的参数会放入一个数组内并赋给needles。即needles被设为['b', 'nan']

注意,只有最后一个参数可以被标记为rest参数。当函数调用时,rest参数前的参数都正常赋值,多余的参数组成数组赋给rest参数。如果没有多余的参数,那么rest参数就是一个空的数组,而不是undefined

原文