0

forループまたはfor..inループが配列のどこにあるのか疑問に思いました。

私はjsperfを使用してこれをテストしました。

私 のForループは16,676,377 op/s
for..in519,853 op/s

では、その理由は次のとおりです。

var a = ["hi", "hi2", "bye", "bye2"];

for (var i in a) {
  return a[i];
}

に比べて遅い:

var a = ["hi", "hi2", "bye", "bye2"];

for (var i = 0; i < a.length; i++) {
  return a[i];
}
4

4 に答える 4

3

あなたの質問に対する答えは簡単です。 for in loop は配列を処理するために作成されたものではなく、追加のことも行うため、使用しないでください。

for-in ステートメントの主な目的は、配列を介してではなく、思考オブジェクトのプロパティを反復することです。このステートメントは、継承されたプロパティを介した配列プロトタイプチェーン、反復にも入りますが、これは必要ないか、知らないと思います。

それがどの順序で反復されるかさえわからないというもう1つの面白いこと。

したがって、覚えておくべき主なことは、配列で for を使用しないことです。オブジェクトのみ。

RobGが正しく追加されたPSとして:

for ループは、[[Prototype]] チェーンのプロパティも、配列で見つからない場合に検索します。たとえば、[0,,2] に対する for ループは、Object.prototype[[Prototype]] までずっと 1 を検索します。

于 2013-03-07T23:26:52.713 に答える
1

ここにはいくつか問題があります。

  1. returnループの本体にいると、最初の反復後にループが中止され、テストは役に立たない
  2. for..inオブジェクトのプロパティをループします。配列の要素だけがプロパティではありません。などのプロパティを追加しましたかa.foo = true。との繰り返しには含まれますが、には含まれfor..inませんfor

for..in配列のループには使用しないでください。いいえ。これまで。

于 2013-03-07T23:27:19.180 に答える
0

JavaScript エンジンの実装に大きく依存します。JavaScript は動的に型付けされるため、インタープリターは特定の変数の型を確立するために何らかの作業を行う必要があります。for...in を使用する場合には利用できない古典的な整数反復子 for ループのエンジンに最適化があると思われます。

編集:

for..in は変数の列挙可能なプロパティを反復処理するため、ループごとに配列内の各文字列の値が var i に割り当てられます。

于 2013-03-07T23:22:41.870 に答える
0

forループがループよりも高速である理由を説明するにfor inは、基本的に、データをメモリに格納するために使用される基本的なデータ構造を理解する必要があります。配列がメモリに格納される方法により、インデックスベースの配列をループする方が当然高速です。これは単なるメモリ内の場所であり、配列内のアイテムは連続した場所に格納されます。順番に、隣同士に。一般に、要素を見つけるのに時間を費やす必要がないため、連続した順序で要素を取得する方が高速です。次のアイテムが常にその隣の次の場所であることがわかっているだけです。またarray.length、メモリのどのチャンクが配列用に分割されているかを認識し、判断できるためです。

于 2013-03-07T23:27:24.920 に答える