为什么for.in()循环不返回数组内部的对象

Why for..in() loop doesn't return objects inside of an array?

本文关键字:数组 返回 内部 对象 循环 for in 为什么      更新时间:2023-09-26

我在一个angular控制器中有这样一段代码:

for (var obj in $scope.items) {
   obj.done = false;
}

这是我的$scope.items的样子:

$scope.items = [
  {
    name: "Task #1",
    done: false
  },
  {
    name: "Task #2",
    done: false
  }
];

对我来说很奇怪,我的for循环实际上不起作用。obj不是循环中的对象。我试图做obj变量的console.log,它打印出数组$scope.items的索引。为什么会这样呢?既然这是一个foreach循环,那么obj不应该是$scope.items中的每个对象吗?

for..in枚举对象的属性names:

var foo = { a: 5, b: 7 };
for (var x in foo) {
    console.log(x);
}
// -> a
// -> b

如果你想要属性,你只需要在对象中使用名称查找属性:

var foo = { a: 5, b: 7 };
for (var x in foo) {
    var value = foo[x];
    console.log(value);
}
// -> 5
// -> 7

然而,对于数组,使用它的属性来迭代它的元素并不是一个好主意。如果向数组中添加常规属性,例如:

var arr = [ 1, 2, 3 ];
arr.myProp = "someValue";

myProp也将出现在for..in循环中,这通常是不需要的。相反,强烈建议使用常规 for循环或使用Array.forEach:

来遍历数组。
arr.forEach(function(value, index) {
    console.log(value);
})
// -> 1
// -> 2
// -> 3

for .. in迭代键(或索引),而不是值。你应该这样做:

for (var index in $scope.items) {
    $scope.items[index].done = false;
}

一般来说,使用for .. in迭代数组被认为是一种不好的做法。您可以使用forEach方法代替:

$scope.items.forEach(function (item) {
    item.done = false;
});

for..in所做的是迭代对象的属性或属性,而不是数组的元素。如果你想迭代一个数组,那么你应该使用普通的for循环for(var i =0; i<n; i++)..