Что возвращает метод `forEach` в JavaScript?

«Что возвращает метод `forEach` в JavaScript?» — вопрос из категории JavaScript, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод Array.prototype.forEach() всегда возвращает undefined. Его основная задача — выполнить переданную callback-функцию для каждого элемента массива, а не создать новый массив или вернуть значение.

Пример, демонстрирующий возвращаемое значение:

const numbers = [1, 2, 3];
const returnValue = numbers.forEach(num => console.log(num * 2));
// В консоль выведется: 2, 4, 6

console.log(returnValue); // undefined

Ключевые особенности для тестирования:

  • Непрерываемость: Использование return внутри callback-функции не прервёт итерацию (в отличие от цикла for).
    const arr = [1, 2, 3, 4];
    arr.forEach(item => {
    if (item === 2) return; // Просто выходит из текущей итерации, а не из всего forEach
    console.log(item); // Выведет: 1, 3, 4
    });
  • Мутация исходного массива: Сам массив не изменяется, но можно модифицировать его элементы, если они являются объектами.
    const users = [{ name: 'Alice' }, { name: 'Bob' }];
    users.forEach(user => user.name = user.name.toUpperCase());
    console.log(users); // [ { name: 'ALICE' }, { name: 'BOB' } ]
  • Побочный эффект: forEach используется для операций с побочными эффектами (логирование, изменение внешних переменных, вызов других функций). Для трансформации данных или фильтрации следует использовать map или filter.

В контексте написания тестов: Я использую forEach для организации параметризованных тестов, когда нужно прогнать один и тот же assertion для набора данных.

describe('Login validation', () => {
  const invalidEmails = ['test', 'test@', '@domain.com', 'test@domain.'];

  invalidEmails.forEach(email => {
    it(`should reject invalid email: ${email}`, () => {
      const result = validateEmail(email);
      expect(result.isValid).toBe(false);
    });
  });
});