for(var i = 0; i< a.length; i ++){vs. for(var i in a){

时间:2011-08-28 20:28:46

标签: javascript for-loop

  

可能重复:
  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){

3 个答案:

答案 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。您首先尝试使用a0进行索引,但由于0不是有效索引,因此无法返回任何内容,然后尝试1并获取'嘿'。所以你可以看到这显然是错误的。

第二个将覆盖每个指数,无论它是什么。

因此,第一个版本假设所有索引按顺序为数字,而第二个版本将迭代每个索引,无论它是什么。

答案 2 :(得分:2)

没有

当您需要枚举数组的自然顺序时,请将前者用于数组。当排序不重要或不合适时,将后者用于对象。