3

我有这个代码:

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] is undefined。

有人知道这怎么可能吗?

4

5 回答 5

2

循环符号

for (var i in this.units)

为您提供在“单位”对象中定义的属性。其中一些可能没有价值,例如,如果某处做了某事:

this.units.balloon = null;

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

于 2010-03-09T14:31:36.857 回答
1

Pointy 在他的回答中简要谈到了问题的可能原因,那this.units[i]可能是无效的。如果您尝试访问 null 值的属性,您将收到“为 null 或不是对象”错误。this.units[i].x在您的示例中,这是由if 语句中的访问尝试引发的。最安全的做法是先检查它是否为空值:

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循环不适合数组。

于 2010-03-09T14:54:43.020 回答
1

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

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

del this.units[i]

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

于 2010-03-09T14:57:11.140 回答
1

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

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

obj.myProp = null;

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

delete obj.myProp;

myProp 不会在 for in 循环中迭代。

于 2010-03-09T15:12:48.567 回答
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 循环(如上所示)。

于 2010-03-09T14:31:02.140 回答