避免修改和传递`arguments`给其他方法 — 影响优化
背景
在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];
}
没错,这很啰嗦,但是在生产环境中的代码里,为了系统性能优化,这是值得的。
Use the 100 answers in this short book to boost your confidence and skills to ace the interviews at your favorite companies like Twitter, Google and Netflix.
GET THE BOOK NOWA short book with 100 answers designed to boost your knowledge and help you ace the technical interview within a few days.
GET THE BOOK NOW