人生的价值,并不是用时间,而是用深度去衡量的。 ——<列夫·托尔斯泰>
背景
在 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); |
没错,这很啰嗦,但是在生产环境中的代码里,为了系统性能优化,这是值得的。
参考
关注【公众号】,了解更多。

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!
支付宝打赏
微信打赏