我有这段代码:
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]未定义。
有人知道这是怎么回事吗?
答案 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循环(如上所示)。