Как лучше всего делать циклы в JavaScript

Обновление до tomcat 7.0.70 разрешило проблему для меня

28
задан Jeff Atwood 11 October 2008 в 02:25
поделиться

9 ответов

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

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);
}

знать, что вышеупомянутое только приемлемо для итерации списка, который содержит значения "non-falsy". Если этот массив содержал какой-либо из:

  • 0
  • ложь
  • ""
  • пустой указатель
  • NaN

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

Для предотвращения этого использования:

var current;

while((current=iterator())!==undefined)
{
   console.log(current);
}
36
ответ дан Ash 11 October 2008 в 02:25
поделиться

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

  var len = a.length;
  for (var i = 0; i < len; i++) {
    var element = a[i];
  }
6
ответ дан Randy Sugianto 'Yuku' 11 October 2008 в 02:25
поделиться
  • 1
    +1 Несколько строковых литералов строки являются not' t поддерживаемый в VB.Net. Некоторые люди используют (или злоупотребление?) Литералы XML для подобного эффекта как это (см. комментарий). – MarkJ 31 October 2012 в 12:35

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

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

var i = a.length, element = null;
while (i--) {
  element = a[i];
}
6
ответ дан Remy Sharp 11 October 2008 в 02:25
поделиться

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

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

while(i <= max)
{
var element = a[i];
i++;
}
2
ответ дан Kibbee 11 October 2008 в 02:25
поделиться
  • 1
    Я don' t имеют мой код до завтра, но спасибо evan, если это кажется странным – Christophe Debove 9 December 2011 в 20:19

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

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

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

1
ответ дан nickf 11 October 2008 в 02:25
поделиться

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

  var i = a.length;
  while( --i >= 0 ) {
    var element = a[i];
    // do stuff with element
  }  
1
ответ дан Mr. Muskrat 11 October 2008 в 02:25
поделиться
  • 1
    в настоящее время в 2017 необходимо использовать value="https://www.googleapis.com/auth/calendar email" – user3479125 17 August 2017 в 11:09

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

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

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

for (i in a) { var element = a[i]; }
10
ответ дан Chase Seibert 11 October 2008 в 02:25
поделиться
  • 1
    @Pondidum: В зависимости от требований, конечно. Отредактирует. – Jon Skeet 31 October 2012 в 10:38

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

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

Так:-для взятия in самое длинное, с помощью свойства длины (то, которое является свойством и не должно быть вычислено), почти с такой скоростью, как хранит его сначала - который является только контактным усиком медленнее, чем использование целого числа.
И для () обычный способ циклично выполниться по массиву, который все ожидают и понимают.

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

0
ответ дан meouw 11 October 2008 в 02:25
поделиться
  • 1
    @Imray Это полезно, когда Вам просто интересно, является ли условие в Вашем WHERE пункт TRUE или FALSE. Это часто используется в запросах sub. – mrt 24 November 2015 в 09:19

Так, сначала Вы определяете идеальный цикл JavaScript, я полагаю, что он должен быть похожим на это:

ary.each (функция () {$arguments [0]) .remove ();})

Это может потребовать prototype.js библиотеки.

Затем, Вы получаете disgustet с аргументами [0] часть и имеете код быть произведенными автоматически из Вашей серверной инфраструктуры. Это работает, только если лестничная структура является Побережьем.

Теперь, Вам генерировали вышеупомянутое:

ary делают: [: каждый | каждый элемент удаляет].

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

-2
ответ дан nes1983 11 October 2008 в 02:25
поделиться
  • 1
    Btw., каково поведение по умолчанию? Я принимаю it' s LAZY? – fritzmg 29 July 2016 в 09:43
Другие вопросы по тегам:

Похожие вопросы: