人生的价值,并不是用时间,而是用深度去衡量的。 ——<列夫·托尔斯泰>
背景
在 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。
- https://github.com/petkaantonov/bluebird/wiki/Optimization-killers
传递arguments
给任何方法被称为leaking arguments
。
如果你想用一个包含参数(arguments)的数组,你需要求助于这个办法:
1 | var args = new Array(arguments.length); |
没错,这很啰嗦,但是在生产环境中的代码里,为了系统性能优化,这是值得的。
参考
关注【公众号】,了解更多。
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!