我有这个代码:
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。
有人知道这怎么可能吗?
我有这个代码:
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。
有人知道这怎么可能吗?
循环符号
for (var i in this.units)
为您提供在“单位”对象中定义的属性。其中一些可能没有价值,例如,如果某处做了某事:
this.units.balloon = null;
除非你真的知道你的对象发生了什么,否则使用“in”循环遍历对象属性是非常危险的。如果您的对象实际上是一个数组,那么您肯定不想这样做 - 您应该使用数字索引和带有数字变量的普通循环。(即使那样,也可能有空条目!)
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
循环不适合数组。
我的坏:我认为这个问题是在 python 中!
你可能正在做类似的事情:
del this.units[i]
在您的代码中的某处或以某种方式更改您的集合。这是迭代期间的禁止。
首先,如果你的迭代是在一个对象上,不要使用“i”作为迭代变量,使用 prop 或 key 来明确你是在迭代属性,而不是索引。
其次,听起来您可以简单地调试并找出对象中的哪些元素是空的。没有完整的代码,很难为您提供帮助。我认为问题在于您正在删除
obj.myProp = null;
这意味着 for in 循环仍将遍历该属性。但是,如果您使用
delete obj.myProp;
myProp 不会在 for in 循环中迭代。
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 循环(如上所示)。