web-dev-qa-db-ja.com

JavaScript:JSLintエラー「プロトタイプから不要なプロパティをフィルタリングするためにforステートメントの本文をifステートメントでラップする必要があります」

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によってフラグが立てられないように修正する方法は誰にでもあります

31
HeatherK

keypairsが配列の場合、次のような要素を実際に反復する必要があります。

for(var i = 0; i < keypairs.length; i++) {
  ...
}

keypairsがハッシュの場合、JSLintは、適切なキータイプで動作していることを確認することを正しく推奨しています(つまり、ハッシュが期待されるタイプであることを確認しています)

のようなもの

for(var i in keypairs) {
  if(keypairs.hasOwnProperty(i)) {
    ...
  }
}

ここで、ifは任意の基準を検証しており、プロトタイプ関数などにアクセスしていないことを確認します。

40
Chris Baxter

hasOwnPropertyの使用を求めています。

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i))
    {
        // Use i
    }
}

JSLintの多くと同様に、これは推奨事項であり、その適用可能性は状況によって異なります。オブジェクトのプロトタイプに不要な enumerable プロパティがある場合に役立ちます。これは、たとえば特定のJavaScriptライブラリを使用します。

16

for...inの問題は、プロトタイプのプロパティもトラバースすることであり、ほとんどの場合、これは必要なことではありません。そのため、プロパティを hasOwnProperty でテストする必要があります。

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i) {
        //...
    }
}
5
Felix Kling
_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/ でさらに説明されています。

この警告をオフにするには、「フィルターされていないために許容する」をチェックします。

3
kennytm

jslint自身のドキュメントを見てください: http://www.jslint.com/lint.html セクションに移動します

のために

彼らは次のことを行います:for (name in object) { if (object.hasOwnProperty(name)) { .... } }

0
ds111