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" ループでオブジェクト プロパティを反復処理するのは非常に危険です。オブジェクトが実際に配列である場合は、絶対にそうしたくありません。数値インデックスと数値変数を使用した単純なループを使用する必要があります。(それでも、null エントリがある可能性があります!)

于 2010-03-09T14:31:36.857 に答える
1

まず、反復がオブジェクトに対して行われる場合は、反復変数として「i」を使用せず、propまたはkeyを使用して、インデックスではなくプロパティを反復していることを明確にします。

次に、オブジェクト内のどの要素が空であるかを簡単にデバッグして見つけることができるようです。完全なコードがなければ、あなたを助けるのは難しいです。問題はあなたがすることによって削除していることだと思います

obj.myProp = null;

これは、forinループが引き続きそのプロパティを反復処理することを意味します。ただし、使用する場合

delete obj.myProp;

myPropはforinループで繰り返されません。

于 2010-03-09T15:12:48.567 に答える
1

私の悪い点: この質問は python にあると思いました!

あなたはおそらく次のようなことをしています:

del this.units[i]

コードのどこかで、または何らかの方法でコレクションを変更します。これは反復中は No-No です。

于 2010-03-09T14:57:11.140 に答える
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 に答える