Ответ
Метод 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);
});
});
});