Три упомянутых вами метода имеют разные цели.
Цель метода Array.prototype.map
- создать новый массив с результатами вызова функции обратного вызова для каждого элемента массива.
Цель метода Array.prototype.forEach
- выполнить итерацию по массиву, выполнив предоставленную функцию обратного вызова один раз для каждого элемента массива.
Цель оператора for...in
состоит в том, чтобы перечислить свойства объекта .
Я думаю, что следует избегать оператора for...in
для обхода любого подобного массиву объекта 1 , где реальная цель повторять по числовым индексам, а не перечислять свойства объекта (даже зная, что эти индексы являются свойствами).
Причины, по которым for...in
следует избегать повторения массивоподобных объектов:
- Итерация по наследуемым определяемым пользователем свойствам в дополнение к элементам массива, если вы используете библиотеку, например MooTools, которая расширяет объект
Array.prototype
, вы увидите все эти расширенные свойства.
- Порядок итерации произвольный, элементы нельзя посещать в числовом порядке.
Посмотрите на эту статью:
1 Под массивоподобными объектами я подразумеваю любой объект, который содержит последовательные числовые свойства и свойство length