8

JSLintはこのようなことについて不平を言い続けます

var myArray = [1, 2, 3];
for (var value in myArray)
{
   // BLAH
}

ifステートメントでラップする必要があると言っています。オブジェクトのプロパティをループしている場合はラップする必要があることはわかっていますが、正しいフィルタリングを行うには、ここでifステートメントに何を入力する必要がありますか。

さらに、私が次のようなことをするとき

for (var i = 0; i < 10; i++)
{
   // foo
}

for (var i =0; i < 20; i++)
{
   // bar
}

私はすでに定義されていると文句を言います。異なる変数名を使用する以外にこれを防ぐにはどうすればよいですか?

4

4 に答える 4

9

JSLintは、それほど有害ではない多くのことについて悩んでいます。この場合for...in、配列をループするのは間違った構成であるため、について文句を言うのは正しいことです。

これは、数値キーだけでなく、配列またはそのArray.prototypeに追加されたその他の任意のプロパティも取得するためです。後者は通常、フレームワークによって追加された拡張ユーティリティ関数に由来します。

hasOwnPropertyプロトタイプのメンバーではないことを確認するためにそのケースを打ち負かすことができますが、それは単に適切な方法でそれを行うよりも醜いfor (var i= 0...)ので、なぜわざわざするのですか。

また、for...inあなたが期待するかもしれないように、あなたは必ずしもアイテムを番号順に得るとは限りません。

私はすでに定義されていると文句を言います。異なる変数名を使用する以外にこれを防ぐにはどうすればよいですか?

ええ、あなたはそれを無視することができます。

同じスコープで変数を2回宣言しても何も起こらないためvar、2番目のからを削除する必要があります。for (i...ただしvar、害を及ぼさないため、そのままにしておくことをお勧めします。ループを別のブロックに移動した場合、グローバルで突然スクライブすることは望ましくありません。

于 2009-10-26T18:44:36.773 に答える
8

本当に、jslintを聞く必要はありません。しかし、本当に合格したい場合は(これは素晴らしいことです)、次のようにすることができます。

var myArray = [1, 2, 3];
for (var value in myArray)
{
  if (myArray.hasOwnProperty(value)) {
    // BLAH
  }
}

2番目の部分では、それらを関数に入れるか、別の変数を使用する必要があります。もう1つの解決策は、すでに定義されているため、2回目のi代わりに使用することです...var i

于 2009-10-26T18:43:08.507 に答える
4

JSLintのドキュメントを見ると、for-inループのフィルタリングの背後にある理論的根拠を説明するリンクがあります。基本的には、オブジェクトのプロトタイプに追加された列挙可能なプロパティにつまずかないようにするためです。(とにかく配列を反復処理するためにfor-inを使用するべきではありませんが。)

2番目のケースでは、変数を2回宣言しています。変数にはJavaScriptの関数スコープ(またはグローバルスコープ)があります。Douglas Crockford、したがってJSLintは、変数が存在するスコープに対して1回だけ変数を宣言する方がよいと主張しています。

var i;

for (i = 0; i < 10; i++)
{
   // foo
}

for (i =0; i < 20; i++)
{
   // bar
}
于 2009-10-26T18:45:09.347 に答える
0

良い基準点としてJSLintに従うことをお勧めします。いくつかのオプションを構成して、チェックを緩くすることをお勧めします。

とにかく、配列を反復処理する最良の方法は、 forループではなくforループを使用することです

詳細な説明が必要な場合は、この投稿をお読みください

于 2010-12-06T13:53:32.697 に答える