Каков самый быстрый способ перебора массива в javascript?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
6 637
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Что не так с старомодным добрым шлейфом for?

for( var i = 0; i < list.length; i++ ) {
    // do something with list[i]
}

Семантика for...in и for...each...in, как правило, сбивает людей с толку и приводит к неожиданным результатам.

В Javascript разрешение переменной запаздывает. В приведенном выше примере вам нужно будет определять длину каждой итерации цикла. Вы должны кэшировать переменную длины, выполнив for (var i = 0, l = list.length; i <l; i ++). Хорошее практическое правило - чем меньше точек, тем лучше в JS.

steve_c 07.01.2009 23:13
Ответ принят как подходящий

Отметьте это Тесты цикла JavaScript.

@Plan B: Да, посмотрите и эту статью: moddular.org/log/javascript-loops

Christian C. Salvadó 07.01.2009 22:52

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

Michael Haren 07.01.2009 22:53

@Micheal - Ага в моей Опере первая без какой-либо оптимизации часто оказывается самой быстрой ...

rkj 07.01.2009 23:24

Ссылка CMS должна показать вам, что для небольших наборов данных все они быстрые, единственное, что я бы посоветовал, это избегать for (a in b), поскольку он имеет гораздо более высокие накладные расходы на память, чем любая другая конструкция цикла, и потенциально может быть намного медленнее из-за своего " интересная "семантика.

Как бы то ни было, за исключением for(in), любой настоящий JS должен тратить немного больше времени на выполнение реальной работы, чем тратится на обработку самого цикла, поэтому незначительные вариации в стоимости цикла не должны быть слишком важны.

Об этом недавно рассказывалось в Блог Грега Реймера.

Быстрый ответ таков:

for (var i=0, node; node = hColl[i++];) {
    // do something with node
}

почему там i++? вам нужно будет использовать (i-1), чтобы "что-то сделать с узлом"

ajax333221 13.05.2012 09:13

Как ответили в другом месте (почему существует этот поток?): Обратное, а:

var i = foo.length; while (i--) { /* do something with foo[i] */ }

..это самый быстрый цикл, если вы можете решить следующие проблемы:

  • обратный порядок не всегда подходит

  • это немного сложно читать

  • он добавляет переменную к следу любой области, в которой она находится

  • это лишь немного быстрее, чем цикл for с меньшим размером и более читаемой длиной кэширования.

Если массив основан на 0, вы должны использовать --i в цикле while, иначе он выйдет за границы var i = foo.length; while (--i) {/ * сделать что-нибудь с foo [i] * /}

aaronfarr 23.06.2011 04:59

Вы можете видеть здесь, что это не всегда верно: jsperf.com/loops/33. Большинство циклов, кэширующих длину массива, работают более или менее одинаково быстро.

Blaise 10.01.2013 14:04

Предположительно объекты быстрее ... Например:

var array = {"0": "foo", "1": "bar"}
for(var i in array){
    var val = array[i];
    // do something
}

Другие вопросы по теме