for..in循环遍历数组也遍历原型函数

时间:2013-09-06 13:46:14

标签: javascript arrays loops for-loop

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

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; item = 123;
  2.   
  3. 循环:i = 1; item = 456;
  4.   
  5. 循环:i = 2; item = 789;
  6.   
  7. 循环:i =比较;
  8.   
  9. 循环:i = union;
  10.   
  11. 循环:i =删除;
  12.   
  13. 循环:i =选择;
  14.   
  15. 循环:i =包含;
  16.   

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

正如我所说,我以前从未见过这个......

2 个答案:

答案 0 :(得分:4)

Do not use for..in to iterate over Array。这将迭代 Array对象的所有可枚举属性,并且可能不会按顺序迭代它们。有两种选择:

  • Array.forEach(IE8不支持,虽然可能有垫片)。
  • 一个简单的for循环

答案 1 :(得分:0)

那不是一个但是,你只是迭代所有可枚举的数组属性,并且你使用的库添加了Array.prototype这样的函数:

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

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

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

但是你永远不应该使用for..in迭代数组。像这样迭代:

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