Подтвердить что ты не робот

Каков наилучший способ создания циклов в JavaScript?

Я наткнулся на несколько методов цикла в JavaScript, что мне больше всего нравится:

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

Но как протестировано здесь (http://www.robertnyman.com/2008/04/11/javascript-loop-performance/), его, вероятно, следует записать так, чтобы длина вычислялась только один раз.

В jQuery есть .each, что вы можете использовать функцию. Мне это немного лучше, потому что мне не нужно вводить массив дважды, как в приведенном выше решении.

Если поддерживаемые JavaScript макросы будут куском пирога, чтобы катиться самостоятельно, но, к сожалению, это не так.

Итак, что вы, ребята, используете?

4b9b3361

Ответ 1

Я начал использовать итераторы там, где это необходимо. Производительность является разумной, однако, что более важно, она позволяет инкапсулировать логику цикла:

function createIterator(x) {
    var i = 0;

     return function(){
       return x[i++];
    };
}

Затем для использования:

var iterator=createIterator(['a','b','c','d','e','f','g']);

iterator();

возвращает "a";

iterator();

возвращает "b";

и т.д.

Чтобы перебрать весь список и отобразить каждый элемент:

var current;

while(current=iterator())
{
    console.log(current);
}

Помните, что приведенное выше допустимо только для повторения списка, содержащего "не фальшивые" значения. Если в этом массиве содержалось:

  • 0
  • ложь
  • ""
  • NULL
  • NaN

предыдущий цикл остановился на этом элементе, а не всегда, что вы хотите/ожидаете.

Чтобы избежать этого использования:

var current;

while((current=iterator())!==undefined)
{
   console.log(current);
}

Ответ 2

Небольшое улучшение оригинала, чтобы только вычислить размер массива один раз:

for(var i = 0, len = a.length; i < len; i++){ var element = a[i]; }

Кроме того, я вижу много для... циклов. Хотя имейте в виду, что это не технически кошерно и будет создавать проблемы с Prototype специально:

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

Ответ 3

Просто сохраните длину в переменной сначала.

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

Ответ 4

Я знаю, что опаздываю на вечеринку, но я использую обратные циклы для циклов, которые не зависят от порядка.

Очень похоже на @Mr. Muskrat - но упрощающий тест:

var i = a.length, element = null;
while (i--) {
  element = a[i];
}

Ответ 5

Вы всегда можете использовать цикл while и вычислять предел массива перед началом работы.

Var max = a.length-1;
var i = 0;

while(i <= max)
{
var element = a[i];
i++;
}

Ответ 6

Если у вас много элементов в массиве, а скорость - проблема, вы хотите использовать цикл while, который выполняет итерацию с самого высокого на самый низкий.

  var i = a.length;
  while( --i >= 0 ) {
    var element = a[i];
    // do stuff with element
  }  

Ответ 7

Я не использую его сам, но один из моих коллег использует этот стиль:

var myArray = [1,2,3,4];
for (var i = 0, item; item = myArray[i]; ++i) {
    alert(item);
}

как ответ Ash, это затронет проблемы, если у вас есть "ложные" значения в вашем массиве. Чтобы избежать этой проблемы, измените ее на (item = myArray[i]) != undefined

Ответ 8

Я не вижу, что проблема с использованием стандарта для цикла (;;). Небольшой тест

var x;
var a = [];
// filling array
var t0 = new Date().getTime();
for( var i = 0; i < 100000; i++ ) {
    a[i] = Math.floor( Math.random()*100000 );
}

// normal loop
var t1 = new Date().getTime();
for( var i = 0; i < 100000; i++ ) {
    x = a[i];
}

// using length
var t2 = new Date().getTime();
for( var i = 0; i < a.length; i++ ) {
    x = a[i];
}

// storing length (pollution - we now have a global l as well as an i )
var t3 = new Date().getTime();
for( var i = 0, l = a.length; i < l; i++ ) {
    x = a[i];
}

// for in
var t4 = new Date().getTime();
for( var i in a ) {
    x = a[i];
}

// checked for in
var t5 = new Date().getTime();
for( var i in a ) {
    if (a.hasOwnProperty(i)) {
        x = a[i];
    }
}

var t6 = new Date().getTime();
var msg = 'filling array: '+(t1-t0)+'ms\n'+
          'normal loop: '+(t2-t1)+'ms\n'+
          'using length: '+(t3-t2)+'ms\n'+
          'storing length: '+(t4-t3)+'ms\n'+
          'for in: '+(t5-t4)+'ms\n'+
          'checked for in: '+(t6-t5)+'ms';
console.log( msg );

приводит к:

filling array: 227ms
normal loop: 21ms
using length: 26ms
storing length: 24ms 
for in: 154ms
checked for in: 176ms

Итак: - для того, чтобы в течение наибольшего времени использовать свойство length (которое является свойством и не нужно вычислять), оно почти так же быстро, как и его сохранение, - это всего лишь виски медленнее, чем использование целого числа.
AND a for() - это обычный способ петли над массивом, который все ожидают и понимают.

Все они добавляют переменную к области, в которой они запускаются, - я - это общее имя для этого использования и поэтому не должно использоваться для других целей. Сохранение длины сначала добавляет еще одну переменную - к области, которая является ненужной

Ответ 9

Итак, сначала вы определяете идеальный цикл javascript, я считаю, что он должен выглядеть следующим образом:

ary.each(function() {$ arguments [0]). remove();})

Для этого может потребоваться библиотека prototype.js.

Далее вы получите отвращение с помощью аргументов [0] и получите код, который будет автоматически создан из вашей серверной инфраструктуры. Это работает только в том случае, если лестница - это Море.

Теперь у вас получилось:

ary do: [: each | каждый элемент remove].

Это завершается завершением синтаксиса и точно переводится в вышеупомянутый javascript. И это заставит людей возглавить, которые раньше не использовали интеграцию прототипов морей, когда они читали ваш код. Это тоже заставляет вас чувствовать себя круто. Не говоря уже о выигрыше в geekiness вы можете получить здесь. Девочки любят это!