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

for..in loop over an Array iterates also over the prototype functions

本文关键字:遍历 原型 函数 循环 for in 数组      更新时间:2023-09-26

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

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

现在我想用一个 for.. 迭代这个数组。在 - 循环中:

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 = 包含;

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

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

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

  • Array.forEach(IE8-不支持,尽管可能有填充程序)。
  • 一个简单的for循环
这不是

错误,您只是遍历所有可枚举的数组属性,并且您使用添加函数的库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) {