javascript函数和参数对象,是否涉及成本

Dim*_*off 18 javascript performance

在Web和框架中看到类似的代码是很常见的:

var args = Array.prototype.slice.call(arguments);
Run Code Online (Sandbox Code Playgroud)

在这样做时,您将参数Object转换为实数Array(尽管JS具有真正的数组),它允许您在Array原型中应用的任何数组方法等应用于它等.

我记得在某处读取arguments直接访问Object的速度明显慢于Array克隆,或者明显选择命名参数.是否有任何事实,在什么情况下/浏览器会导致性能损失?你知道的关于这个主题的任何文章?

http://bonsaiden.github.com/JavaScript-Garden/#function.arguments 更新有趣的发现,这使我之前阅读的内容无效...希望这个问题可以从写这篇文章的@Ivo Wetzel那里获得更多答案.

在该部分的底部,它说:

表现神话和真相

始终创建arguments对象,只有两个例外,即在函数内部或其形式参数之一声明它的名称.无论是否使用都无关紧要.

这与http://www.jspatterns.com/arguments-considered-harmful/冲突,其中指出:

但是,出于以下原因使用参数不是一个好主意:

  • 性能
  • 安全

每次调用函数时都不会自动创建arguments对象,JavaScript引擎只会按需创建它(如果使用的话).而且这种创造在性能方面并不是免费的.使用参数与不使用参数之间的差异可能会慢1.5到4倍,具体取决于浏览器

显然,不能两者都是正确的,那么它是哪一个呢?

ECMA顽固的Dmitrty Soshnikov说:

究竟"JavaScript引擎"是什么意思?你在哪里得到这个确切的信息?虽然,在某些实现中可能是正确的(是的,这是一个很好的优化,因为在解析代码时可以获得有关上下文的所有必需信息,因此如果在解析时找不到,则不需要创建参数对象),但是当你知道ECMA-262-3语句,每次进入执行上下文时都会创建参数对象.

Koo*_*Inc 5

这是一些问答测试。使用预定义arguments似乎是最快的,但这样做并不总是可行。如果事先未知函数的数量(因此,如果函数可以或必须接收可变数量的参数),我认为调用Array.prototype.slice一次将是最有效的方法,因为在这种情况下,使用对象的性能损失arguments是最小的。