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

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

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

所以我们可以迭代:

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

And:

for (var i in myArray)

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


当前回答

两者之间有一个重要的区别。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(;;)语句。

其他回答

两者之间有一个重要的区别。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(;;)语句。

Douglas Crockford建议在JavaScript: The Good Parts(第24页)中避免使用for in语句。

如果使用for in遍历对象中的属性名,则结果是无序的。更糟的是:你可能会得到意想不到的结果;它包括从原型链继承的成员和方法名。

除了属性以外的所有内容都可以用. hasownproperty过滤掉。这个代码样例做了你最初可能想要的:

for (var name in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, name)) {
        // DO STUFF
    }
}

我曾见过使用对象、原型和数组的“for each”的问题

我的理解是for each是对象的属性,而不是数组

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

例如:

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

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

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

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

我会根据我想引用项目的方式使用不同的方法。

如果只需要当前项,请使用foreach。

如果需要索引器进行相对比较,请使用for。(也就是说,这与上一项/下一项相比如何?)

我从来没有注意到性能上的差异。我会等到出现性能问题时再担心。