为什么'for(列表中的var项)'与数组在JavaScript中被认为是不好的做法?

Tat*_*nen 73 javascript arrays loops

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

var list = ['Foo', 'Bar', 'Baz'];
Run Code Online (Sandbox Code Playgroud)

很多时候,我注意到有人建议循环遍历数组中的变量,如下所示:

for(var item in list) { ... }
Run Code Online (Sandbox Code Playgroud)

......几乎可以肯定有人认为这是不好的做法,并提出了另一种方法:

var count = list.length;

for(var i = 0; i < count; i++) {
    var item = list[i];
    ...
}
Run Code Online (Sandbox Code Playgroud)

不使用上面更简单的版本并使用第二个例子的原因是什么?

Tim*_*own 89

首先,循环的顺序未定义for...in,因此不能保证属性将按您想要的顺序迭代.

其次,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)
Run Code Online (Sandbox Code Playgroud)

  • 一个建议,将`over all properties`改为`over**enumerable**properties`.在较新的javascript实现中,可以使用`enumerable`属性设置为`false`来定义属性.内置javascript对象的这些属性和属性不会出现在`for ... in`中. (10认同)
  • @Dimitar:的确,虽然你已经添加了它,但循环已经不再像标准的C风格循环那样简单了. (4认同)
  • 只要你使用`hasOwnProperty` - `for(var i in a){if(a.hasOwnProperty(i))console.log(i); }` - > 1 2 3 (2认同)

Ama*_*osh 17

速度?

for(..;..;..)循环证明比我在这里测试时快36倍for .. in .

链接礼貌这个答案

  • 我误读了无限循环比普通循环快36倍.感谢您的链接+1. (4认同)