JSLintツールを使用して、JavaScriptが「厳密」であることを確認しています。
次のエラーが表示されますが、修正方法がわかりません。
The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype
次のコードの場合:
for (var i in keypairs) {
...
}
これをJavaScriptの「厳密な」ものにしてJSLintによってフラグが立てられないように修正する方法は誰にでもあります
keypairs
が配列の場合、次のような要素を実際に反復する必要があります。
for(var i = 0; i < keypairs.length; i++) {
...
}
keypairs
がハッシュの場合、JSLintは、適切なキータイプで動作していることを確認することを正しく推奨しています(つまり、ハッシュが期待されるタイプであることを確認しています)
のようなもの
for(var i in keypairs) {
if(keypairs.hasOwnProperty(i)) {
...
}
}
ここで、ifは任意の基準を検証しており、プロトタイプ関数などにアクセスしていないことを確認します。
hasOwnProperty
の使用を求めています。
for (var i in keypairs) {
if(keypairs.hasOwnProperty(i))
{
// Use i
}
}
JSLintの多くと同様に、これは推奨事項であり、その適用可能性は状況によって異なります。オブジェクトのプロトタイプに不要な enumerable プロパティがある場合に役立ちます。これは、たとえば特定のJavaScriptライブラリを使用します。
for...in
の問題は、プロトタイプのプロパティもトラバースすることであり、ほとんどの場合、これは必要なことではありません。そのため、プロパティを hasOwnProperty
でテストする必要があります。
for (var i in keypairs) {
if(keypairs.hasOwnProperty(i) {
//...
}
}
_for (var i in keypairs) {
if (keypairs.hasOwnProperty(i)) {
...
}
}
_
これは、for
/in
ループがサードパーティライブラリによって拡張されたいくつかのメソッドを反復する可能性があるためです。がある場合
_Object.prototype.clone = function() { ... }
_
次に、.hasOwnProperty()
条件なしで、_.clone
_メソッドが_...
_でも繰り返されます。
これはJSLintページ自体からリンクされている http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ でさらに説明されています。
この警告をオフにするには、「フィルターされていないために許容する」をチェックします。
jslint自身のドキュメントを見てください: http://www.jslint.com/lint.html セクションに移動します
のために
彼らは次のことを行います:for (name in object) { if (object.hasOwnProperty(name)) { .... } }