hasOwnProperty を使用してフィルタリング
概要
in 演算子と同様に、for in ループもオブジェクトのプロパティを検索するときにプロトタイプ チェーン上のすべてのプロパティを走査します。
// 修改 Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // 输出两个属性:bar 和 moo }
for 自体の動作を変更することは不可能なので、ループ本体に表示したくないプロパティを除外する必要があります。これは、Object.prototype プロトタイプの hasOwnProperty 関数を通じて行うことができます。 。
注: for in ループは、配列の length プロパティなど、enumerable が false に設定されているプロパティを走査しません。
hasOwnProperty フィルターを使用する
// foo 变量是上例中的 for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
このバージョンのコードが唯一の正しい記述方法です。 hasOwnPropertyを使用したので、今回はmooのみが出力されます。 hasOwnProperty が使用されていない場合、ネイティブ オブジェクト プロトタイプ (Object.prototype など) が拡張されるときにこのコードが壊れる可能性があります。
広く使用されているクラス ライブラリ プロトタイプは、ネイティブ JavaScript オブジェクトを拡張します。 したがって、このクラス ライブラリがページに含まれている場合、hasOwnProperty フィルタリングを使用しない for in ループでは必然的に問題が発生します。
注: for in は常にプロトタイプチェーン全体を走査するため、オブジェクトの継承レベルが深すぎると、パフォーマンスに影響します。
概要
常に hasOwnProperty を使用し、コードが実行されている環境について仮定を立てたり、ネイティブ オブジェクトが拡張されているかどうかを仮定したりしないことをお勧めします。
上記は JavaScript 上級シリーズ - for in ループの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。