避免修改和传递`arguments`给其他方法 — 影响优化
背景
在JavaScript的方法里,arguments
参数可以让你访问传递给该方法的所有参数。arguments
是一个类数组对象;arguments
可是使用数组标记访问,而且它有length参数,但是它没有filter
、map
和forEach
这样内建到数组内的方法。因此,如下代码是一个非常常见的将arguments
转换为数组的办法:
1 | var args = Array.prototype.slice.call(arguments); |
将arguments
传递给Array
原型(prototype)上的slice
方法;slice
方法返回一个对arguments
浅复制后的数组对象。更短的写法:
1 | var args = [].slice.call(arguments); |
在这里,简单的调用了空数组的slice
方法,而没有从Array
的原型(prototype)上调用。
系统优化
不幸的是,传递arguments
给任何参数,将导致Chrome和Node中使用的V8引擎跳过对其的优化,这也将使性能相当慢。看一下这篇文章optimization killers。传递arguments
给任何方法被称为leaking arguments
。
如果你想用一个包含参数(arguments)的数组,你需要求助于这个办法:
1 | var args = new Array(arguments.length); |
没错,这很啰嗦,但是在生产环境中的代码里,为了系统性能优化,这是值得的。
原文作者: anhr
版权声明: 转载请注明出处(必须保留原文作者署名原文链接)