迭代性能比较

kam*_*aci 0 javascript performance loops

我有一个数组:

deleteIds= ["User1"];
Run Code Online (Sandbox Code Playgroud)

并尝试迭代它,如:

第一:

for (var index = 0; index < len; index++) {
    alert(deleteIds[index]);
}
Run Code Online (Sandbox Code Playgroud)

第二个:

for (var index in deleteIds) {
    alert(deleteIds[index]);
}
Run Code Online (Sandbox Code Playgroud)

它们的性能比较是什么?

Mat*_*att 5

这是一个微观优化充其量.除非你的deleteIds数组中有数十万个元素,否则你不应该考虑优化它.

事实证明,该for(;;;)版本比for in以下版本更快:http://jsperf.com/iterating-over-a-loop/2(感谢@Jamiec为jsperf).

然而,比这些的性能比较更重要的是,两个代码片段在功能上彼此不同(实例).

var array = new Array(100);
for (var i = 0; i < array.length; i++) {
    console.log(i); // shows 0 - 99
}

for (var x in array) {
    console.log(x); // shows nothing
}
Run Code Online (Sandbox Code Playgroud)

此外,如果将方法添加到数组或数组原型链中的对象,它们将显示在for (var x in y)循环中,但不会显示在for (;;;);(实例)中:

Array.prototype.foo = function() {};
var array = [];
for (var i = 0; i < array.length; i++) {
    console.log(i); // nothing
}

for (var x in array) {
    console.log(x); // `foo`
}
Run Code Online (Sandbox Code Playgroud)

您可以使用它hasOwnProperty来消除从原型链继承的属性,但这不会阻止您直接在对象上接收方法(实例):

Array.prototype.foo = function() {};
var array = [];
array.bar = function () {};

for (var i = 0; i < array.length; i++) {
    console.log(i); // nothing
}

for (var x in array) {
    if (array.hasOwnProperty(x)) {
        console.log(x); // `bar`
    }
}
Run Code Online (Sandbox Code Playgroud)

正是由于这些原因,for in不鼓励使用迭代数组,而for(;;;)始终使用版本.for in应该用于迭代对象.