私は自分の JavaScript ファイルにJSLintを使用しました。次のエラーが発生しました:
for( ind in evtListeners ) {
41 行目の 9 文字目の問題: プロトタイプから不要なプロパティをフィルター処理するには、for in の本体を if ステートメントで囲む必要があります。
これはどういう意味ですか?
ベストアンサー1
まず第一に、配列を列挙するためにループを使用しないでください。絶対に。古き良き を使用してください。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 in
てください。for 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