代码之家  ›  专栏  ›  技术社区  ›  Tatu Ulmanen

为什么在javascript中,“for(var item in list)”和数组被认为是不好的做法?

  •  67
  • Tatu Ulmanen  · 技术社区  · 15 年前

    给定一个简单的基于零的数字索引数组:

    var list = ['Foo', 'Bar', 'Baz'];
    

    很多时候,我注意到当有人建议像这样循环数组中的变量时:

    for(var item in list) { ... }
    

    …几乎可以肯定,有人建议这是一种不好的做法,并建议采用另一种方法:

    var count = list.length;
    
    for(var i = 0; i < count; i++) {
        var item = list[i];
        ...
    }
    

    不使用上面的简单版本,而是使用第二个示例,原因是什么?

    5 回复  |  直到 6 年前
        1
  •  82
  •   Tim Down    14 年前

    首先,循环的顺序对于 for...in 循环,因此无法保证属性将按您想要的顺序进行迭代。

    第二, 为了…… 迭代对象的所有可枚举属性,包括从其原型继承的属性。对于数组,如果您的代码或页面中包含的任何库增加了 Array 这是一件真正有用的事情:

    Array.prototype.remove = function(val) {
        // Irrelevant implementation details
    };
    
    var a = ["a", "b", "c"];
    
    for (var i in a) {
        console.log(i);
    }
    
    // Logs 0, 1, 2, "remove" (though not necessarily in that order)
    
        2
  •  16
  •   Community CDub    8 年前

    速度?

    for(..;..;..) 事实证明,这个循环比 for .. in when I tested it here.

    Link courtesy this SO answer

        3
  •  1
  •   user180326    15 年前

    如果你这样使用的话, item 通过字符串值“0”、“1”、…”枚举,因此不是列表中的实际对象。所以第一个片段中的“item”更像 i 在第二个片段中,不是 项目 . 此外,字符串值在您期望的数字处进行枚举。当你在列表中出现问题,比如 array.ID = "a123" ,因为它们也将被枚举。

    但是有了这些缺点,我仍然认为语法非常有用,如果您的团队知道它的作用。

        4
  •  0
  •   kapa    14 年前

    添加 list.foo = bar; 尽量使用简单的 for . 如果不使用某些库(如原型),也不向数组对象添加任何新属性,那么可以使用simple for语句。

        5
  •  0
  •   Alice    6 年前

    for ... in ... 不返回列表项,而是枚举数组属性。

    就因为这个原因, 不能 代替 for (i=0; i<arr.length; i++) 循环。

    适当的替代方案是 for ... of ... 构建。 它枚举可重写对象的值,如数组。您可以在MDN Web文档上阅读更多关于它的信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

    它得到了相关的现代浏览器的支持(Internet Explorer不算数,取而代之的是Microsoft Edge)。如果你负担不起不支持旧浏览器的费用,那么这可能是一条可行之路。您可以在先前链接的MDN页面的末尾查看方便的浏览器支持表,查看哪些浏览器版本实际上允许 为了…的… 用法。