背景在JavaScript的方法里,arguments参数可以让你访问传递给该方法的所有参数。arguments是一个类数组对象;arguments可是使用数组标记访问,而且它有length参数,但是...
在JavaScript的方法里,arguments
参数可以让你访问传递给该方法的所有参数。arguments
是一个类数组对象;arguments
可是使用数组标记访问,而且它有length参数,但是它没有filter
、map
和forEach
这样内建到数组内的方法。因此,如下代码是一个非常常见的将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];
}
没错,这很啰嗦,但是在生产环境中的代码里,为了系统性能优化,这是值得的。