可能重复:
for(var i in aArray) VS for(i=0; i<aArray.length; i++)
可以安全地假设这些东西总是会做同样的事情,而且我应该总是使用后者吗?
for (var i = 0; i < a.length; i++){
for (var i in a){
答案 0 :(得分:7)
不,这不安全,因为它们不是一回事。
第一个迭代数字索引,直到.length
属性中以数字顺序存储的任何值。
第二个枚举对象的所有可枚举属性,包括prototyped属性,并不保证任何类型的顺序。
拿一个数组:
var arr = ['a','b','c'];
现在向构造函数的prototype
对象添加一些内容:
Array.prototype.sayHello = function() { alert('hi'); };
如果你使用for-in
语句,你最终会点击sayHello
函数,而不仅仅是数字索引。
如果您正在处理除了索引之外没有可枚举属性的对象,并且您不关心顺序,那么我猜它真的没关系,但是正确的形式仍然可以使用for
声明。
答案 1 :(得分:2)
不,因为(假设在第一个版本中使用i
来索引a
),数组可以包含非整数索引。所以如果你有:
a = {1:1, 'f': 'hey'}
在第一个版本中,i
将是0
,然后是1
。您首先尝试使用a
对0
进行索引,但由于0
不是有效索引,因此无法返回任何内容,然后尝试1
并获取'嘿'。所以你可以看到这显然是错误的。
第二个将覆盖每个指数,无论它是什么。
因此,第一个版本假设所有索引按顺序为数字和,而第二个版本将迭代每个索引,无论它是什么。
答案 2 :(得分:2)
没有
当您需要枚举数组的自然顺序时,请将前者用于数组。当排序不重要或不合适时,将后者用于对象。