为什么数组在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语句。