1

このオブジェクトのメソッドを呼び出すと、"i" が存在しない属性を参照しているため、"Oops" エラーが発生することがあります。どのように可能ですか?

m.derp();
m.herp(); // Sometimes throws error

方法:

this.movements = new Array();
this.herp = function() {
    for (var i in this.movements) {
        if (!(this.movements[i] instanceof Movement)) {
            throw new Error("Oops"); // this.movements[i] is undefined
        }
    }
}
this.derp = function() {
    var newArray = new Array();
    for (var i in this.movements) {
        if (!this.movements[i].isFinished()) {
            newArray.push(this.movements[i]);
        }
    }
    this.movements = newArray;
}
4

3 に答える 3

3

配列の場合、 を使用しないでくださいfor-in。これは、プロトタイプを介して継承されたものを含む、すべての列挙可能なプロパティを含む一般的な列挙子です。

これを行う必要があります...

for (var i = 0; i < this.movements.length; i++) {

Array.prototypeまたはに追加されたプロパティは、 のObject.prototype使用時に検出されfor-inます。

数値インデックスのみが必要な場合forは、このステートメントを使用するのが正しいステートメントです。...以下の TJ Crowder が指摘するように、特定の狭い状況を除きます。

于 2012-07-05T22:34:50.933 に答える
1

通常for-in、配列には使用しないでください。その構成は、オブジェクトでの使用に適しています。従来のforループを使用します。

for (var i=0, len=this.movements.length; i<len; i++) //do stuff...

この理由の詳細については、この質問を参照してください。

于 2012-07-05T22:35:13.740 に答える
1

配列を反復するために for in を使用しないでください。実際には、配列オブジェクトのすべてのプロパティを反復しているため、継承されているものも含まれています (存在するかどうかはわかりません)。単純なループを使用:

for(var i = 0; i < arr.length; i++){

}
于 2012-07-05T22:35:56.583 に答える