Ответ
Метод forEach всегда возвращает undefined. Его единственное предназначение — выполнение побочного эффекта (side-effect) для каждого элемента массива. Он не создаёт новый массив и не предназначен для трансформации данных.
Пример, демонстрирующий возвращаемое значение:
const numbers = [1, 2, 3];
const returnValue = numbers.forEach(num => {
console.log(num * 2); // Побочный эффект: логирование
});
console.log(returnValue); // undefined
Ключевые особенности forEach:
- Не прерывается: Использование
returnвнутри callback-функции не прерывает итерацию (в отличие отfor...ofилиsome()). - Мутация возможна: Хотя
forEachне меняет сам массив, он может изменять элементы, если они являются объектами (мутация по ссылке). - Не chainable: Поскольку возвращает
undefined, его нельзя использовать в цепочке методов послеmapилиfilter.
Когда использовать? Только когда нужен побочный эффект (логирование, модификация внешней переменной, вызов функции). Для трансформации данных используйте map, для фильтрации — filter, для поиска — find.
Ответ 18+ 🔞
Ну, слушай, вот есть у тебя массив, да? И ты такой: "О, сейчас я его пройдусь и что-то сделаю с каждым элементом!". Берёшь forEach — и вперёд. А потом пытаешься результат в переменную запихнуть и думаешь: "Ну, вот, сейчас у меня тут новый массив будет, всё красиво". А там, сука, undefined! Пиздец, да? Охуеть можно.
Так вот, запомни раз и навсегда, как "отче наш": forEach всегда возвращает undefined. Его задача — не вернуть тебе хуй с горы, а просто сделать какое-то дело для каждого элемента. Побочный эффект, блядь, называется. Логировать, что-то во внешнюю переменную пихнуть, или, там, DOM-элемент обновить.
Смотри, пример, чтобы в мозгу щёлкнуло:
const numbers = [1, 2, 3];
const returnValue = numbers.forEach(num => {
console.log(num * 2); // Вот, побочный эффект — в консоль плюём.
});
console.log(returnValue); // undefined. Вообще нихуя. Ноль.
Вот и вся магия. А теперь, чтобы ты не наступал на эти грабли, как дурак, запомни ещё пару моментов:
- Его не остановить. Крикнул ты внутри
return— так он на тебя посмотрит, как на идиота, и пойдёт дальше по всем элементам. Хочешь сбежать по-раньше — тебе не сюда.for...ofилиsome()в помощь. - Мутировать может, но осторожно. Сам массив он не перепишет, но если внутри объекты лежат — он их по ссылке так подправить может, что мало не покажется. Хитрая жопа.
- В цепочку не поставишь. Ну как его поставить, если он
undefinedвозвращает? Вот именно. Сделал дело сforEach— гуляй. Дальше цепочку не продолжишь.
Так когда его, блядь, использовать-то? Да только тогда, когда тебе нужен именно побочный эффект. Вывел в лог, отправил запрос, обновил интерфейс — вот тогда да.
А если тебе нужно:
- Преобразовать данные —
map, ёпта. - Отфильтровать —
filter, ясень пень. - Найти один элемент —
findилиsome.
Не выёбывайся, используй правильный инструмент, и будет тебе счастье, а не undefined в переменной.