1. ホーム
  2. ジャバスクリプト

[解決済み】JSLintのエラー「body of a for in should be wrapped in in if statement」はどういう意味ですか?

2022-04-16 17:04:01

質問

私は JSLint を私のJavaScriptファイルに追加しました。それはエラーを投げました。

for( ind in evtListeners ) {

41行目の文字9の問題:for inの本体は、以下のようにする必要があります。 を if 文でラップして、不要なものをフィルタリングする。 プロパティをプロトタイプから削除してください。

これはどういうことでしょうか?

どのように解決するのですか?

まず最初に。 決して を使用します。 for in ループを使用して、配列を列挙します。決して 古き良き for(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_0 . しかし filter_0 は、特定の配列オブジェクトのフィールドではなく、すべての配列オブジェクトがこのプロパティを持っています。

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

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

このコードは配列に対しては期待通りに動作しますが、決してそうではないことに注意してください。 決して を使用します。 for infor each in は配列の場合です。このとき for 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