9

長さは JavaScript のプロパティであるため、使用するかどうかは重要ですか?

for( var i = 0; i < myArray.length; i++ )

また

var myArrayLength = myArray.length;
for( var i = 0; i < myArrayLength ; i++ )

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

4

8 に答える 8

9
for(var i = 0, iLen = myArray.length; i < iLen; i++)

さまざまな Javascript ループ構造のベンチマークについては、 http://blogs.oracle.com/greimer/resource/loop-test.htmlを参照してください。

于 2008-10-03T19:24:22.703 に答える
2

myArray が JavaScript 配列である場合、それについて心配することは問題ではありません。オブジェクトの単なるプロパティ検索ですが、変数の使用法もそうです。

OTH の長さが、ブラウザー DOM (特に IE) によって提供されるコレクション オブジェクトによって公開されるプロパティである場合、驚くほどコストがかかる可能性があります。したがって、そのようなDOM提供のコレクションを列挙するとき、私は使用する傾向があります:-

for (var i = 0, length = col.length; i < length; i++)

しかし、配列の場合、私はそれを気にしません。

于 2008-10-03T19:26:01.453 に答える
2

あなたの質問の意図に対する答えは、はい、ループ内で配列を変更すると、ループの繰り返しごとに array.length プロパティが再計算されると思います。たとえば、次のコード:

var arr = [1,2,3];
for(var i = 0; i < arr.length; i++){
  console.debug("i = " + i);
  console.debug("indexed value = " + arr[i])
  arr.pop();
}

出力します:

i = 0
indexed value = 1
i = 1
indexed value = 2

一方、このコード:

var arr = [1,2,3];
var l = arr.length;
for(var i = 0; i < l; i++){
  console.debug("i = " + i);
  console.debug("indexed value = " + arr[i])
  arr.pop();
}

出力します:

i = 0
indexed value = 1
i = 1
indexed value = 2
i = 2
indexed value = undefined

-J

于 2008-10-05T20:54:35.893 に答える
1

length プロパティは呼び出しごとに計算されるわけではありませんが、プロパティ ルックアップをキャッシュしているため、後者のバージョンの方が高速です。高度な (例: SmallTalk 時代;) プロパティ キャッシングを使用する最新の JS 実装 (V8、TraceMonkey、SquirrelFish Extreme) を使用しても、プロパティ ルックアップは、2 番目のバージョンよりも少なくとも 1 つの余分な条件分岐です。

Array.length は一定ではありませんが、JS 配列は変更可能であるため、push, pop, array[array.length]=0, etcすべて変更される可能性があります。

NodeListなどの呼び出しから取得する DOM などの他の概念があり、document.getElementsBySelectorライブであることが期待されます。その場合、反復時に長さが再計算される場合があります。ただし、長さが再計算された場合、実際に変更されている可能性が高いため、出力を手動でキャッシュすることは有効ではない可能性があります。

于 2008-10-03T22:05:15.110 に答える
1

いいえ。呼び出し時に再計算されません。Array クラス内で必要に応じて再計算します。

pushpopshiftunshiftconcatspliceなどを使用すると変更されます。それ以外の場合は、単なる Number です。値を呼び出すたびに同じインスタンスになります。

ただし、明示的にオーバーライドしない限り ( array.length = 0 )、呼び出しごとに正確になります。

于 2008-10-03T19:30:06.937 に答える
0

ループ中に変更される可能性があるという考えがある場合は、もちろん、ループごとにチェックする必要があります...

-- それ以外の場合は、if ステートメントの評価プロパティにオブジェクトを配置した場合と同様に、オブジェクトに何度も尋ねるのは明らかにおかしいです ...

if(i=0, iMax=object.length; iMax>i; i++)

-- 特別な場合にのみ、別の方法を考えるべきです!-)

于 2008-10-05T20:35:07.040 に答える
0

ECMAScript 仕様によれば、「長さ」プロパティの計算方法を示すだけで、いつ. 実装に依存する可能性があると思います。

私がそれを実装するとしたら、Jonathanが指摘したとおりにしますが、それは Array オブジェクトの「長さ」プロパティの場合です。

于 2008-10-03T22:27:12.430 に答える
0

2 番目の形式の方が高速な場合があります。

function p(f) { var d1=new Date(); for(var i=0;i<20;i++) f(); print(new Date()-d1) }
p(function(){for(var i=0;i<1000000; i++) ;})
p(function(){var a = new Array(1000000); for(var i=0;i<a.length; i++) ;})
> 823
> 1283

..エッジ以外のケースでは、それほど重要ではありません。

于 2008-10-03T19:32:00.693 に答える