迭代对象数组javascript - 奇怪的行为?

And*_*Hin 29 javascript

var myArr = [{a:1, b:2}, {c:3, d:4}];

for (var item in myArr) {
    console.log(item);
}
Run Code Online (Sandbox Code Playgroud)

Item返回键(例如:0,1)而不是对象本身.为什么?

sgo*_*les 36

道格拉斯克罗克福德建议在JavaScript:好的部分 避免使用该for in声明.

如果您使用for in循环对象中的属性名称,则不会对结果进行排序.

for in循环是最好的用于遍历名称-值对,并且for each环路最好用于遍历值,即阵列.

例如,

var o = {'name':'Batman', 'age':33, 'city':'Gotham City'};
   for (var p in o) {
        console.log(p+': '+o[p]);
    }
Run Code Online (Sandbox Code Playgroud)

如果我们要为上面的对象使用For Each Loop,我们就无法获得属性名称.


注意 :

  1. 对于循环是最好的名称-值对.
  2. 对于每对迭代值循环是最好的.例如:如果您对属性的名称不感兴趣,则使用数组和对象.

  • @Andy:[`for each ... in`](https://developer.mozilla.org/en/JavaScript/Reference/Statements/for_each...in)语句是仅在基于Mozilla的实现中可用的扩展, (它不适用于其他浏览器).使用数组时,只需使用任何顺序循环... [另请参阅](http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays/4261096#4261096). (3认同)
  • 这不应该被标记为答案,因为它适用于简单数组,而不适用于对象数组 (2认同)

pom*_*meh 22

Javascript for.. in循环总是返回索引/名称,而不是值.为了得到你想要的,你应该使用:

var myArr = [{a:1, b:2}, {c:3, d:4}];

for (var index in myArr) {
    console.log( myArr[index] );
}
Run Code Online (Sandbox Code Playgroud)

但是,如前所述,应谨慎使用for.. in语句,并且不应与数组一起使用.你应该使用for循环代替

var myArr = [{a:1, b:2}, {c:3, d:4}];

for( var i=0, l=myArr.length; i<l; i++ ) {
    console.log( myArr[i] );
}
Run Code Online (Sandbox Code Playgroud)