背景

在JavaScript的方法里,arguments参数可以让你访问传递给该方法的所有参数。arguments是一个类数组对象arguments可是使用数组标记访问,而且它有length参数,但是它没有filtermapforEach这样内建到数组内的方法。因此,如下代码是一个非常常见的将arguments转换为数组的办法:

var args = Array.prototype.slice.call(arguments);

arguments传递给Array原型(prototype)上的slice方法;slice方法返回一个对arguments浅复制后的数组对象。更短的写法:

var args = [].slice.call(arguments);

在这里,简单的调用了空数组的slice方法,而没有从Array的原型(prototype)上调用。

系统优化

不幸的是,传递arguments给任何参数,将导致Chrome和Node中使用的V8引擎跳过对其的优化,这也将使性能相当慢。看一下这篇文章optimization killers。传递arguments给任何方法被称为leaking arguments

如果你想用一个包含参数(arguments)的数组,你需要求助于这个办法:

var args = new Array(arguments.length);
for(var i = 0; i < args.length; ++i) {
  args[i] = arguments[i];
}

没错,这很啰嗦,但是在生产环境中的代码里,为了系统性能优化,这是值得的。