JSLint エラー「for in の本体は if ステートメントで囲む必要があります」とはどういう意味ですか? 質問する

JSLint エラー「for in の本体は if ステートメントで囲む必要があります」とはどういう意味ですか? 質問する

私は自分の JavaScript ファイルにJSLintを使用しました。次のエラーが発生しました:

for( ind in evtListeners ) {

41 行目の 9 文字目の問題: プロトタイプから不要なプロパティをフィルター処理するには、for in の本体を if ステートメントで囲む必要があります。

これはどういう意味ですか?

ベストアンサー1

まず第一に、配列を列挙するためにループを使用しないでください。絶対に。古き良き を使用してください。for infor(var i = 0; i<arr.length; i++)

その理由は次のとおりです。JavaScript の各オブジェクトには、 と呼ばれる特別なフィールドがあります。そのフィールドに追加した内容はすべて、そのタイプのすべてのオブジェクトでアクセス可能になります。すべての配列に、ゼロをフィルターする とprototype呼ばれる新しい便利な関数を追加したいとします。filter_0

Array.prototype.filter_0 = function() {
    var res = [];
    for (var i = 0; i < this.length; i++) {
        if (this[i] != 0) {
            res.push(this[i]);
        }
    }
    return res;
};

console.log([0, 5, 0, 3, 0, 1, 0].filter_0());
//prints [5,3,1]

これは、オブジェクトを拡張して新しいメソッドを追加する標準的な方法です。多くのライブラリがこれを行っています。しかし、for in現在どのように機能するかを見てみましょう。

var listeners = ["a", "b", "c"];
for (o in listeners) {
    console.log(o);
}
//prints:
//  0
//  1
//  2
//  filter_0

わかりますか? 突然、filter_0 が別の配列インデックスであると認識されます。もちろん、これは実際には数値インデックスではありませんが、数値for inインデックスだけでなく、オブジェクト フィールドを列挙します。つまり、すべての数値インデックスとを列挙することになります。ただし、は特定の配列オブジェクトのフィールドではなく、すべての配列オブジェクトがこのプロパティを持つようになりました。 filter_0filter_0

幸いなことに、すべてのオブジェクトにはhasOwnProperty、このフィールドが実際にオブジェクト自体に属しているかどうか、または単にプロトタイプ チェーンから継承されてそのタイプのすべてのオブジェクトに属しているかどうかをチェックするメソッドがあります。

for (o in listeners) {
    if (listeners.hasOwnProperty(o)) {
       console.log(o);
    }
}
 //prints:
 //  0
 //  1
 //  2

このコードは配列に対しては期待どおりに動作しますが、配列に対しては絶対に や を使用しないでください。 は配列のインデックスや値ではなく、オブジェクトのフィールドを列挙することに注意for inてください。for each infor in

var listeners = ["a", "b", "c"];
listeners.happy = "Happy debugging";

for (o in listeners) {
    if (listeners.hasOwnProperty(o)) {
       console.log(o);
    }
}

 //prints:
 //  0
 //  1
 //  2
 //  happy

おすすめ記事