0

我有一个严重的错误,这是我以前从未见过的。首先我有一个简单的数组:

var myArray = ["123", "456", "789"]

现在我想用 for..in 循环遍历这个数组:

function mapData(list) {
for ( var i in list) {
    var item = list[i];
    if (item) {
      // do something
    }
  }
}

使用 mapData(myArray) 调用该方法后,firebug 在调试器中显示:

  1. 循环:i = 0;项目 = 123;
  2. 循环:i = 1;项目 = 456;
  3. 循环:i = 2;项目 = 789;
  4. 循环: i = 比较;
  5. 循环: i = 联合;
  6. 循环: i = 删除;
  7. 循环:i = 选择;
  8. 循环: i = 包含;

所以我认为这是原型功能。但为什么?有任何想法吗?

正如我所提到的,我以前从未见过这个......

4

2 回答 2

4

不要for..in用于迭代 Array。这将遍历对象的所有可枚举属性,Array并且可能不会按顺序遍历它们。有两种选择:

  • Array.forEach(不支持 IE8-,虽然可能有一个 shim)。
  • 一个简单的for循环
于 2013-09-06T13:51:14.087 回答
1

这不是错误,您只是在迭代所有可枚举的数组属性,并且您使用的库添加了Array.prototype这样的函数:

Array.prototype.union = function(...)

可以通过使用defineProperty设置函数使函数不可枚举来修复库:

Object.defineProperty(Array.prototype, 'union', {value:function(){...}});

但是你永远不应该用它for..in来迭代一个数组。

像这样迭代:

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

或像这样:

for (let item of list) {
于 2013-09-06T13:47:49.980 回答