Page 95 - 你不知道的JavaScript(下卷)
P. 95
function foo(...args) {
console.log( args );
}
foo( 1, 2, 3, 4, 5); // [1,2,3,4,5]
foo(..) 函数声明中的 ...args 通常称为“rest 参数”,因为这里是在收集其
余的参数。我喜欢用“收集”这个词,因为这更好地描述了它的行为而不是
它的内容。
这种用法最好的一点是,它为弃用很久的 arguments 数组——实际上它并不是真正的数
组,而是类似数组的对象——提供了一个非常可靠的替代形式。因为 args(或者随便你
给它起什么名字——很多人喜欢用 r 或 rest)是一个真正的数组,前 ES6 中有很多技巧
用来把 arguments 转变为某种我们可以当作数组来使用的东西,现在我们可以摆脱这些愚
蠢的技巧了。
考虑:
// 按照新的ES6的行为方式实现
function foo(...args) {
// args已经是一个真正的数组
// 丢弃args中第一个元素
args.shift();
// 把整个args作为参数传给console.log(..)
console.log( ...args );
}
// 按照前ES6的老派行为方式实现
function bar() {
// 把arguments转换为一个真正的数组
var args = Array.prototype.slice.call( arguments );
// 在尾端添加几个元素
args.push( 4, 5 );
// 过滤掉奇数
args = args.filter( function(v){
return v % 2 == 0;
} );
// 把整个args作为参数传给foo(..)
foo.apply( null, args );
}
bar( 0, 1, 2, 3 ); // 2 4
函数 foo(..) 声明中的 ...args 收集参数,console.log(..) 调用中的 ...args 将其展开。
72 | 第 2 章
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权