你认为……有很大的不同吗?In和for循环?你更喜欢用哪种for ?为什么?

假设我们有一个关联数组数组:

var myArray = [{'key': 'value'}, {'key': 'value1'}];

所以我们可以迭代:

for (var i = 0; i < myArray.length; i++)

And:

for (var i in myArray)

我看不出有什么大的不同。是否存在性能问题?


当前回答

根据使用的循环类型和浏览器的不同,会有不同的性能。

例如:

for (var i = myArray.length-1; i >= 0; i--)

在某些浏览器上几乎是以下速度的两倍:

for (var i = 0; i < myArray.length; i++)

然而,除非你的数组是巨大的,或者你不断地循环它们,所有的都足够快。我严重怀疑数组循环是你的项目(或任何其他项目)的瓶颈。

其他回答

根据使用的循环类型和浏览器的不同,会有不同的性能。

例如:

for (var i = myArray.length-1; i >= 0; i--)

在某些浏览器上几乎是以下速度的两倍:

for (var i = 0; i < myArray.length; i++)

然而,除非你的数组是巨大的,或者你不断地循环它们,所有的都足够快。我严重怀疑数组循环是你的项目(或任何其他项目)的瓶颈。

使用for (var i in myArray)你也可以遍历对象,i将包含键名,你可以通过myArray[i]访问属性。另外,你添加到对象中的任何方法都将包含在循环中,也就是说,如果你使用任何外部框架,如jQuery或prototype,或者如果你直接向对象原型添加方法,在某一点上,我将指向那些方法。

jQuery用户


jQuery的each(回调)方法使用for(;,)默认情况下循环,仅当长度未定义时才使用for(in)。

因此,我认为在使用这个函数时,假设正确的顺序是安全的。

例子:

$(['a','b','c']).each(function() {
    alert(this);
});
//Outputs "a" then "b" then "c"

使用它的缺点是,如果你在做一些非UI逻辑,你的函数将不太容易移植到其他框架。each()函数可能最好保留给jQuery选择器使用,而对于(;,)否则可能是明智的。


两者之间有一个重要的区别。for-in迭代对象的属性,所以当case是一个数组时,它不仅会迭代它的元素,还会迭代它的“remove”函数。

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

//Output
0
1

for (var i in myArray) { 
    console.log(i) 
} 

// Output
0 
1 
remove

你可以在if(myArray.hasOwnProperty(i))中使用for-in。不过,在数组上迭代时,我总是倾向于避免这种情况,只使用for(;;)语句。

使用forEach跳过原型链

只是上面@nail的答案的一个快速附录,使用forEach和对象。keys意味着你可以避免在原型链上迭代,而不必使用hasOwnProperty。

var Base = function () {
    this.coming = "hey";
};

var Sub = function () {
    this.leaving = "bye";
};

Sub.prototype = new Base();
var tst = new Sub();

for (var i in tst) {
    console.log(tst.hasOwnProperty(i) + i + tst[i]);
}

Object.keys(tst).forEach(function (val) {
    console.log(val + tst[val]);
});