


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что не так с старомодным добрым шлейфом for?
for( var i = 0; i < list.length; i++ ) {
// do something with list[i]
}
Семантика for...in и for...each...in, как правило, сбивает людей с толку и приводит к неожиданным результатам.
Отметьте это Тесты цикла JavaScript.
@Plan B: Да, посмотрите и эту статью: moddular.org/log/javascript-loops
Надеюсь, это подтолкнет вас к тому, что будет самым ясным, а не самым быстрым. Все они быстрые.
@Micheal - Ага в моей Опере первая без какой-либо оптимизации часто оказывается самой быстрой ...
Ссылка CMS должна показать вам, что для небольших наборов данных все они быстрые, единственное, что я бы посоветовал, это избегать for (a in b), поскольку он имеет гораздо более высокие накладные расходы на память, чем любая другая конструкция цикла, и потенциально может быть намного медленнее из-за своего " интересная "семантика.
Как бы то ни было, за исключением for(in), любой настоящий JS должен тратить немного больше времени на выполнение реальной работы, чем тратится на обработку самого цикла, поэтому незначительные вариации в стоимости цикла не должны быть слишком важны.
Об этом недавно рассказывалось в Блог Грега Реймера.
Быстрый ответ таков:
for (var i=0, node; node = hColl[i++];) {
// do something with node
}
почему там i++? вам нужно будет использовать (i-1), чтобы "что-то сделать с узлом"
Как ответили в другом месте (почему существует этот поток?): Обратное, а:
var i = foo.length; while (i--) { /* do something with foo[i] */ }
..это самый быстрый цикл, если вы можете решить следующие проблемы:
обратный порядок не всегда подходит
это немного сложно читать
он добавляет переменную к следу любой области, в которой она находится
это лишь немного быстрее, чем цикл for с меньшим размером и более читаемой длиной кэширования.
Если массив основан на 0, вы должны использовать --i в цикле while, иначе он выйдет за границы var i = foo.length; while (--i) {/ * сделать что-нибудь с foo [i] * /}
Вы можете видеть здесь, что это не всегда верно: jsperf.com/loops/33. Большинство циклов, кэширующих длину массива, работают более или менее одинаково быстро.
Предположительно объекты быстрее ... Например:
var array = {"0": "foo", "1": "bar"}
for(var i in array){
var val = array[i];
// do something
}
В Javascript разрешение переменной запаздывает. В приведенном выше примере вам нужно будет определять длину каждой итерации цикла. Вы должны кэшировать переменную длины, выполнив for (var i = 0, l = list.length; i <l; i ++). Хорошее практическое правило - чем меньше точек, тем лучше в JS.