1

すべてのアイテムを反復処理する for ループがあります。

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(this.widgets[i]); 
}

for ループでは、要素ごとに「changeWidgetArray」を呼び出します。このメソッドでは、上記の「widgets」配列が変更されます。この「changeWidgetArray」での配列変更は、ループの繰り返しに影響しますか?

私の質問は:

反復が最初の項目から始まる瞬間、すべての要素が「収集」された配列全体であるか、次の反復ステップが始まる前に JavaScript が動的に 1 つずつ取得します。

それとも、これは JavaScript の実装に依存しますか? これは ECMA-Script 仕様で定義されていますか?

事前に感謝します

4

3 に答える 3

5

はい:

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(); 
}

いいえ:

for (var i=0, max=this.widgets.length; i < max; i++) {
  this.changeWidgetArray(); 
}
于 2013-01-23T08:05:57.877 に答える
2

ループの反復中、変数はキャッシュされません。(一時変数で自分でそれをしない限り)

したがって、配列が変更されるたびに の値が更新されるため、評価されるたびthis.widgets.lengthに配列の正確な長さになります。widgetslength

次のように一時変数に割り当てることで、長さをキャッシュできます。

for (var i=0, l = this.widgets.length; i < l; i++) {

ただし、ループ内で配列を変更しているため、配列内の無効なインデックスを指す可能性があるため、それは悪い考えかもしれません。

于 2013-01-23T08:06:19.537 に答える
0

配列の長さは、含まれているコレクションを変更するたびに更新されます。array.lengthを参照するときはいつでも、配列の現在のサイズを反映します。

そのため、多くのパフォーマンス上の利点と同様に、常に次のようにコードを記述する必要があります。

for(var i = 0, l = array.length; i < l; i++){
  // Do stuff with array[l]
}

このようにすると、もう少しパフォーマンスを求めることもできます(トラバースする方向は重要ではないと仮定します)。

var l = array.length;
while(l--){
  // Do stuff with array[l]
}
于 2013-01-23T08:09:04.020 に答える