var myArr = [{a:1, b:2}, {c:3, d:4}];
for (var item in myArr) {
console.log(item);
}
Item返回键(例如:0,1)而不是对象本身。为什么呢?
答案 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 :(得分: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”来表示数组中的任何通用项,但您的数组仅包含对象。如果您知道或期望此数组仅包含每个包含对象,则可以根据数组包含的项目(即对象)的类型命名变量。
快乐的编码!