为什么数组在JavaScript中被认为是不好的做法?

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

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

很多时候,我已经注意到,当有人build议像这样在数组中循环variables:

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

…几乎肯定有人提出这是不好的做法,并build议一种替代方法:

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

有什么理由不使用上面的简单版本,而是使用第二个例子呢?

首先,循环的顺序对于for...in循环是未定义的,所以不能保证属性将按照你想要的顺序迭代。

其次, for...in遍历对象的所有可枚举属性,包括从其原型inheritance的那些属性。 在数组的情况下,如果你的代码或者你的页面中包含的任何库增加了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) 

速度?

for(..;..;..)循环被certificate比for .. in时间快了36倍。

链接礼貌这个答案

如果你使用for / in, item通过string值“0”,“1”,…枚举,所以不是列表中的实际对象。 所以第一个片段中的“item”更像是第二个片段中的i ,而不是item 。 此外,string值列举在你期望的数字。 而当你的属性列表,如array.ID = "a123" ,你会遇到麻烦,因为他们也将被列举。

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

添加list.foo = bar; 并尝试使用简单for 。 如果你不使用一些库(比如prototypeJs),也不需要向数组对象添加任何新的属性 – 你可以使用简单的for语句。