2

javascriptコードのサンプル:

function a() {
    this.array1 = [];
    this.addToArray = function(name) {
        this.array1.push(new b(name));
        return true;
    }
    this.searchForName = function(name) {
        for(var i in this.array1) {
            alert(i.name);
        }
    }
    function b(name) {
        this.name = name;
    }
}

このjavascriptファイルをhtmlドキュメントに含めました。htmlドキュメントのスクリプトタグの中に、次のコードがあります。

var myObject = new a();
myObject.addToArray("test1");
myObject.searchForName("test1");

このコードを実行すると、アラートがポップアップすることを期待します"test1"が、代わりに未定義としてポップアップします。ただし、Chromeのデバッガーは、myObject内に、名前が。のアイテム0を持つ配列があることを示しています"test1"。ブレークポイントを使用してコードをテストすると、アラートが呼び出された時点で、i.nameが未定義であることが示されます。これの何が問題になっていますか?

4

2 に答える 2

2

のメンバーではなくname、番号でプロパティを探しています。iithis.array

それで:

i.name

する必要があります:

this.array1[i].name

結果は次のとおりです。

this.searchForName = function(name) {
    for(var i in this.array1) {
             // get it from this array1
        alert(this.array1[i].name);
    }
}

実例: http: //jsfiddle.net/seNxD/

また、for-in数値インデックスのみに関心がある場合は、ステートメントを使用することはお勧めできません。forステートメントは、列挙していないために使用するものです。

于 2011-01-30T20:27:22.850 に答える
2

for...inMDCのドキュメントに理由が記載されています)を使用してアレイをループしないでください。通常のforループを使用します。

for(var i = this.array1.length;i--;) {
    alert(this.array1[i].name);
}

for...inとにかくオブジェクトのキーをループします。これは配列のインデックスになります。したがって、ループのループ本体は、上記for...inのループの場合とまったく同じに見える必要がありますfor

たとえば、次の場合に使用しfor...inます。

var obj = {foo: 'bar', answer: '42'};
for(var key in obj) {
    alert(key + " is " + obj[key]);
}

さらに注意:コンストラクター関数の名前は大文字で始めるのが慣例です。

于 2011-01-30T20:28:38.393 に答える