for...in を使用したオブジェクト プロパティの反復
for...in ループを使用してオブジェクト プロパティを反復する場合、ループ変数propt は、アクセスされるプロパティのキーを表します。ただし、これはオブジェクトの組み込みメソッドまたはプロパティではありません。
for...in ループは、オブジェクト自体からのプロパティと、そのプロトタイプから継承されたプロパティの両方を取得します。継承されたプロパティは反復に含めることを意図していない可能性があるため、これは問題となる可能性があります。
正確な反復のための hasOwnProperty の使用
この問題を回避するには、次のように追加できます。 for...in ループ内の hasOwnProperty チェック:
for (var prop in obj) { if (Object.prototype.hasOwnProperty.call(obj, prop)) { // Do stuff } }
hasOwnProperty メソッドは、プロパティがプロトタイプから継承されずに、オブジェクト内で直接定義されているかどうかを確認します。このチェックを使用すると、反復から継承されたプロパティを除外できます。
hasOwnProperty とオブジェクトを介した呼び出し
または、オブジェクト自体を介して hasOwnProperty を呼び出すこともできます。
if (obj.hasOwnProperty(prop)) { // Do stuff }
ただし、オブジェクトに無関係なフィールドがある場合、これは失敗する可能性がありますhasOwnProperty と同じ名前 (例:
var obj = { foo: 42, hasOwnProperty: 'lol' }; obj.hasOwnProperty('foo'); // TypeError
) この問題を回避するには、代わりに Object.prototype を通じて hasOwnProperty を呼び出す方が安全です:
Object.prototype.hasOwnProperty.call(obj, 'foo'); // True
以上が「for...in」を使用して JavaScript でオブジェクト プロパティを安全に反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。