33

JavaScript が「厳密」であることを確認するために、 JSLintツールを使用しています。

次のエラーが表示されますが、修正方法がわかりません。

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

4

5 に答える 5

42

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

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

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

のようなもの

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

if は、プロトタイプ関数などにアクセスしていないことを保証する基準を検証しています。

于 2010-11-12T16:10:11.450 に答える
18

使っていただきたいですhasOwnProperty

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

多くの JSLint と同様に、これは推奨事項であり、適用できるかどうかは状況によって異なります。オブジェクトのプロトタイプに望ましくない列挙可能なプロパティがある場合に役立ちます。これは、特定の JavaScript ライブラリを使用する場合などに当てはまります。

于 2010-11-12T16:09:52.497 に答える
5

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

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i) {
        //...
    }
}
于 2010-11-12T16:09:57.460 に答える
3
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/でさらに説明されています。

この警告をオフにするには、[フィルタされていないものを許容する] をオンにします。

于 2010-11-12T16:10:08.410 に答える
0

jslint 自身のドキュメントを見てみましょう: http://www.jslint.com/lint.html セクションにジャンプします。

のために

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

于 2012-11-09T16:17:46.550 に答える