Javascript 中避免修改和传递 `arguments` 给其他方法 — 影响优化

Posted by cl9000 on June 01, 2020

人生的价值,并不是用时间,而是用深度去衡量的。 ——<列夫·托尔斯泰>

背景

JavaScript 的方法里,arguments 参数可以让你访问传递给该方法的所有参数。arguments是一个类数组对象;arguments 可是使用数组标记访问,而且它有 length参数,但是它没有 filtermapforEach 这样内建到数组内的方法。因此,如下代码是一个非常常见的将 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 给任何参数,将导致 ChromeNode 中使用的 V8 引擎跳过对其的优化,这也将使性能相当慢。
看一下这篇文章optimization killers。

如果你想用一个包含参数(arguments)的数组,你需要求助于这个办法:

1
2
3
4
var args = new Array(arguments.length);
for(var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}

没错,这很啰嗦,但是在生产环境中的代码里,为了系统性能优化,这是值得的。

参考

关注【公众号】,了解更多。



支付宝打赏 微信打赏

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