オブジェクトのプロパティを反復処理する 質問する

オブジェクトのプロパティを反復処理する 質問する

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

変数はproptオブジェクトのプロパティをどのように表すのでしょうか? 組み込みメソッドやプロパティではありません。なぜ、オブジェクト内のすべてのプロパティが変数に含まれるのでしょうか?

ベストアンサー1

プロパティを反復処理するには、次の追加hasOwnPropertyチェックが必要です。

for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

オブジェクトのプロトタイプには、技術的にはオブジェクトの一部であるオブジェクトの追加プロパティが含まれているため、これが必要です。これらの追加プロパティは、基本オブジェクト クラスから継承されますが、それでも のプロパティですobj

hasOwnProperty単に、これがこのクラスに固有のプロパティであり、基本クラスから継承されたものではないかどうかを確認します。


hasOwnPropertyオブジェクト自体を介して呼び出すこともできます。

if (obj.hasOwnProperty(prop)) {
    // do stuff
}

ただし、オブジェクトに同じ名前の無関係なフィールドがある場合、これは失敗します。

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

そのため、代わりに呼び出す方が安全ですObject.prototype

var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

おすすめ記事