0

この反復法は、forループよりもはるかに高速であるように見えます。

var arr = window.arr.slice(0),
    fruit = arr.pop();
while (fruit) {
 fruit = list.pop();
}

このjsperfテストで証明されているように:http://jsperf.com/loop-iteration-length-comparison-variations/7

アレイのクローンを作成することでメモリヒットが発生していることはわかっていますが、ループした直後にクローンを削除した場合、他に何にうんざりする必要がありますか?

4

1 に答える 1

2

主な欠点は次のとおりです。

fruit = arr.pop();
while (fruit) {

false と評価された場合fruit(つまり、null、未定義、0 など)、ループは停止します。これは、スパース配列にとっては厄介です。

var arr = [0,,,,2];

最後のメンバーのみをループし、 を評価しようとするとarr[arr.length - 2]、未定義 (存在しない) が返されるため、ループが終了します。forプロパティが最初に存在するかどうかをテストできるため(必要な場合)、これはループで回避できます。

for (var i=0, iLen=arr.length; i<iLen; i++) {

  if (i in arr) {
    // arr has a property i so do stuff with arr[i]
  }
}

したがって、popメソッドは高速かもしれませんが、信頼できるのは、どの値も false と評価されないことが確実な場合、またはカウンターを保持することによってループが終了する場合のみです。

var fruit, 
    i = arr.length;
do {
  fruit = arr.pop();
} while (--i)

だからあなたもそうするかもしれません

do {
  fruit = arr[--i];
} while (i);

コピーを気にしないでください。

于 2012-09-27T02:18:25.887 に答える