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

时间:2011-07-03 20:12:54

标签: javascript

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

for (var item in myArr) {
    console.log(item);
}

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

4 个答案:

答案 0 :(得分:36)

Douglas Crockford建议JavaScript: The Good Parts避免使用for in声明。

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

for in循环最适合迭代名称 - 值对,而for each循环最适合迭代值,即数组。

E.g,

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

如果我们要为上述对象使用For Each Loop,我们无法获得属性名称。


注意:

  1. For in 循环最适合名称 - 值对。
  2. For Each 循环最适合可迭代值。例如:如果您对属性的名称不感兴趣,则为数组和对象。

答案 1 :(得分:22)

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

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

for (var index in myArr) {
    console.log( myArr[index] );
}

但是,如前所述,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] );
}

答案 2 :(得分:3)

for ... in循环遍历对象的键(属性) 它不适用于数组。

它还将迭代从对象的prototype继承的属性。

答案 3 :(得分:1)

在此处添加答案以适应最新的ECMAScript 6标准。

查看this页面,了解有关示例的精彩内容。

一个相当美味的警告:这个令人敬畏的新功能将适用于几乎可迭代的对象!来自MDN:

  

for ... of语句创建一个循环遍历可迭代对象的循环   (包括Array,Map,Set,String,TypedArray,arguments对象和   等等......)

例如,您可以使用:

for (let item of myArr) {
    console.log(item);
} 

虽然要非常清楚你正在记录一个对象,但是通过将“item”重命名为“obj”来为下一个人读取你的代码会更好一点,产生这个:

for (let obj of myArr) {
    console.log(obj);
} 

为什么要重命名变量?好吧,尽管我们使用术语“item”来表示数组中的任何通用项,但您的数组仅包含对象。如果您知道或期望此数组仅包含每个包含对象,则可以根据数组包含的项目(即对象)的类型命名变量。

快乐的编码!