主な欠点は次のとおりです。
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);
コピーを気にしないでください。