我想知道是否使用arguments
var _args = arguments;
arr.forEach(function (val, i) {
arr[i] = _args[i];
});
对优化造成不利影响。
严格来说,它不符合任何these optimization killers但不符合规则
不要在没有.length或[i]
的情况下直接使用参数
任一。在这种情况下,在低级别究竟发生了什么?
JS内部是问题的主题,并且数组迭代的特定实现不是。
答案 0 :(得分:0)
"永远不要使用没有[i]或.length"参数不是关于性能,而是直接关于arguments
对象的黑魔法。
在所有JS引擎的所有版本的所有实现中,无法告诉您发生了什么,因为它'特定于实现。
它的接口有规则,但不是围绕驱动接口的代码的实现。
参数(或任何别名)的定义行为本身会根据您是否处于严格模式而改变,因此性能考虑因素不仅取决于您是处于严格模式还是松散模式,而且还取决于引擎在两个代码路径中的实现。
创建指向arguments
的别名(不是从arguments
构建的数组)实际上根本不会有太大帮助。
它不会帮助人类维持它;它不会帮助运行它的大多数引擎。
它仍然需要表现出与直接引用arguments
相同的神奇行为(因此具有相同的性能含义)(同样,基于严格或松散的操作而不同)。
这就是为什么如果你想对魔法元素(arguments
, live NodeList
等等的实例)做任何事情,你应该将它们的内容放入数组或对象。因为每次访问它们时都需要为访问/修改这些魔术盒中的元素付出代价。
唯一的方法来说明每个引擎,每个引擎版本,每个浏览器,每个设备的成本是多少...... ...就是在所有这些事情上测试它们,期望唯一一致的事实是访问/修改数组内部的元素将比访问/修改魔法实时列表中的元素快得多。 / p>
此外,在审阅了您在评论中链接的蓝鸟维基部分之后,黑魔法正是 他们 在您提供的信息中指的是。
function add (a, b) {
return a + b;
}
function unsafeAdd (a, b) {
arguments[1] = 12;
return a + b;
}
function safeAdd (a, b) {
"use strict";
arguments[1] = 41;
return a + b;
}
add(1, 2); // 3
unsafeAdd(1, 2); // 42
safeAdd(1, 2); // 3
这与速度提升("优化")无关,更多的是与保护免受愚蠢(或聪明的无意识副作用)有关。
但同样,只要查看safeAdd
和unsafeAdd
之间的行为差异,就应该看到为什么效果也会发生变化。