ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript 上級シリーズ - for in ループ

JavaScript 上級シリーズ - for in ループ

黄舟
リリース: 2017-02-08 09:31:14
オリジナル
1127 人が閲覧しました

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) に注目してください。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート