对于迭代,元素是未定义的

时间:2010-03-09 14:29:21

标签: javascript foreach undefined

我有这段代码:

for(var i in this.units)
 {
 if(this.units[i].x==att.x && this.units[i].y==att.y){}
 //... some more code
 }

有时,随机,我得到一个错误this.units [i]未定义。

有人知道这是怎么回事吗?

5 个答案:

答案 0 :(得分:2)

循环符号

for (var i in this.units)

为您提供“units”对象中定义的属性。其中一些可能没有价值,例如,某些地方已做过某些事情:

this.units.balloon = null;

使用“in”循环迭代对象属性是非常危险的,除非你真的知道你的对象发生了什么。如果你的对象实际上是一个数组,那么你肯定不想这样做 - 你应该使用数字索引和带有数字变量的普通循环。 (即便如此,可能会有空条目!)

答案 1 :(得分:1)

Pointy在他的回答中简要地提到了问题的可能原因,那就是this.units[i]可能为空。如果您尝试在空值上访问属性,则会出现“is null or not object”错误。在您的示例中,尝试访问if语句中的this.units[i].x会抛出此异常。最安全的做法是首先检查它是否为空值:

for(var i in this.units) 
{ 
    if (this.units[i] === null)
        continue;

    if(this.units[i].x==att.x && this.units[i].y==att.y){} 
    //... some more code 
}

您还应该查看其答案的其他要点,最重要的是for...in循环不适合数组。

答案 2 :(得分:1)

我的错:我认为这个问题是在python中的!

您可能正在做类似的事情:

del this.units[i]

代码中的某处或以某种方式更改您的收藏。这在迭代期间是禁止的。

答案 3 :(得分:1)

首先,如果你的迭代是在一个对象上,不要使用“i”作为迭代变量,使用prop或key来清楚你是在迭代属性而不是索引。

其次,听起来您可以简单地调试并找出对象中的哪个元素为空。没有完整的代码,很难帮助你。我认为问题是你正在删除

obj.myProp = null;

这意味着for循环仍然会遍历该属性。但是,如果您使用

delete obj.myProp;

myProp不会在for循环中迭代。

答案 4 :(得分:0)

for(var i = 0; i < this.units.length; i++){
    if(this.units[i].x==att.x && this.units[i].y==att.y){}
}

您尝试使用this.units中的元素对this.units进行索引。使用for循环(如上所示)。