Синтаксис JavaScript предоставляет возможность объединять переменные в массивы и объекты. Доступ к элементам можно получить через индексы и имена, посредством операторов цикла.
Но не всегда можно знать количество элементов в коллекции на этапе разработки и не всегда удобно использовать синтаксис языка в пределах предусмотренной им семантики.
Классические конструкции
Обычный оператор цикла "for (var i=0; i<aData.length; i++) {...}" предоставляет доступ к каждому элементу массива через индекс "i" - "aData[i]", и это удобно, когда количество элементов заранее известно. Аналогичный эффект даст конструкция:
var i = 0;
while (typeof aData[i] != 'undefined') { ... aData[i]; ... i++; },
когда количество элементов неизвестно.
Можно построить также иные алгоритмы наполнения и обработки массивов, но гораздо удобнее использовать новые, современные варианты.
Классика хороша, когда нужно обрабатывать анкеты отдела кадров (фамилия, имя, отчество, должность), карточки по оборудованию (модель, изготовитель, продавец, дата продажи) и другие данные, которые структурно не изменяются и представляют совокупный интерес.
Когда элемент массива сам по себе является объектом или структурой, имеет собственные свойства и методы, то классика не справляется с динамикой количества и качества, а массив приобретает иной смысл.
Циклы по каждому элементу
В динамике существенным является проявление массивом свойств актуального элемента. Конструкция JS foreach array, в несколько отличном от привычных (принятых на других языках) варианте, позволяет предоставить массиву возможность проявлять свои свойства через актуальный его элемент.
Допустим, один массив содержит в себе дороги (их качественные и количественные характеристики), а другой массив - автомобили, которые могут ехать только по определенным дорогам и имеют различные по объему баки для топлива, то есть расстояния между заправками также имеют значение.
В таком варианте целесообразный алгоритм должен взять за основу, к примеру, дорогу и выбрать автомобили, которые смогут по ней проехать. А лучше, если дорога и автомобиль, выступая в программе как объекты, "сами себя найдут". Это естественное применение объектно-ориентированного программирования, которое, помимо всего прочего, не приводит к необходимости изменения алгоритма при изменении коллекций дорог и автомобилей, автоматически учитывает дороги в ремонте, автомобили на техобслуживании и т.д.
Технически на JS foreach конструкция выглядит очень просто: "aData.forEach (fData);", где fData - функция, которая применяется к каждому элементу массива aData:
function fData(value, index) { sText += index + '=' + value + '; '; }.
Если исходные данные представлены так:
var aData = [1,2,3,4];
aData.push(11);
aData.push(22);
aData.push(44);
aData.push('line 1');
aData.push('line 2');
var sText = '',
то результат такого применения JS foreach будет:
"0=1; 1=2; 2=3; 3=4; 4=11; 5=22; 6=44; 7=line 1; 8=line 2;".
Особенности массивов с объектами
Объект на JavaScript - особенный. Использование объектов на этом языке существенно отличается от реализаций на других языках. Объект - это сам по себе массив свойств и методов. При этом последние фактически выполняют действия, сохраняя или редактируя свое или внешнее содержание других объектов, массивов, переменных.
Объекты, приходя в массив, как кадры на киноленте, при переборе в конструкции JS foreach object образуют новую семантику: конструкцию изменяемого смысла.
Так, дороги сами по себе получают возможность выбирать машины, которые могут по ним ездить, а последние фильтруют доступные дня них маршруты. Если не обращать внимания, что избыточность в таком варианте программирования повышает надежность кода, то задача - определить маршрут доставки груза - превращает конструкцию JS foreach в смысловое и простое решение: разложить маршруты по дорогам, выбрать машины и выполнить доставку грузов.
Если маршруты, дороги и машины - массивы объектов, то алгоритм значительно упрощается. Казалось бы странным, что появление конструкции JS foreach так долго заставило себя ждать. Однако, несмотря на простоту написанного, на практике довольно сложно ее реализовать.
Практика JS foreach и реальные объекты
Мышление современного разработчика оперирует привычными для программирования объектами, но никак не объектами реальной задачи. Не принято понимать под таковыми дорогу, машину, маршрут, расстояние...
Объектно-ориентированное программирование развивалось тернистыми путями, и традиционно стало принято создавать объекты программ: массив, форма, кнопка, окно выбора маршрута и т.п.
Кроме того, JS foreach наравне с другими конструкциями языка исполняется в браузере посетителя, что привносит на практике серьезные ограничения. Далеко не каждый разработчик готов делиться своим кодом. Эффективные примеры использования массивов и коллекций реальных объектов - хороший способ улучшить знания.
Однако доступность JavaScript кода для непредусмотренного разработчиком использования оказывает косвенное влияние на развитие перспективных идей создания динамичных и реальных объектов. Конструкции JS foreach еще не совершенны, и развитие их семантики представляется очень перспективным направлением.