В чем разница между map и forEach в JavaScript
forEach и mapfrontend разработкаJavaScriptметоды массивовосновы JavaScript
Что проверяют
Понимаете ли вы, что выбор метода это заявление о намерении, а не вкусовщина. Заодно смотрят, знаете ли вы про чистоту функций и цепочки.
Как отвечать
map строит новый массив той же длины из результатов функции. forEach просто прогоняет функцию по элементам и возвращает undefined.
Отсюда правило: нужен результат преобразования, берём map; нужен побочный эффект (записать в базу, вывести в консоль, отправить событие), берём forEach.
const titles = jobs.map((j) => j.title); // новый массив
jobs.forEach((j) => analytics.track(j.id)); // ничего не возвращаетЧто стоит добавить:
- цепочки:
mapвозвращает массив, поэтому за ним идутfilter,sort,join. УforEachцепочки нет вовсе; - прерывание: ни тот, ни другой нельзя остановить через
breakилиreturn. Нужен выход раньше времени, берутfor...of,someилиfind; - пропуски: оба пропускают дыры в разреженных массивах, но
mapсохраняет их в результате; - асинхронность: ни один не ждёт промисы.
arr.forEach(async ...)выполнится, но не дождётся ничего. Правильный способ этоfor awaitилиPromise.all(arr.map(fn)); - производительность: разница мизерна и в реальном коде не аргумент. Аргумент это читаемость:
mapв коде говорит «дальше будет новый массив», и это экономит время читателю.
Где спотыкаются
Используют map ради побочного эффекта и выбрасывают результат. Линтеры это ловят отдельным правилом.
Пишут const result = arr.forEach(...) и получают undefined.
Забывают return в теле map со скобками, из-за чего массив заполняется undefined.