← Назад к вопросам

Изменяет ли forEach первоначальный массив

1.3 Junior🔥 121 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Влияет ли forEach на исходный массив?

Это классический вопрос о понимании метода forEach в JavaScript. Дам подробный ответ с примерами.

Краткий ответ

forEach НЕ изменяет сам массив (не меняет его структуру, длину, порядок элементов), но может изменять содержимое элементов, если они являются объектами или массивами.

Объяснение

1. Неизменяемость массива как структуры

Метод forEach просто итерирует по элементам и не изменяет:

const arr = [1, 2, 3];
arr.forEach((num) => {
  // Операции с num
});

console.log(arr); // [1, 2, 3] - не изменился

2. Изменяемость содержимого элементов

Если элементы - это объекты, мы CAN изменять их свойства:

const users = [{id: 1, name: "Alice"}, {id: 2, name: "Bob"}];

users.forEach((user) => {
  user.name = user.name.toUpperCase(); // Изменяем свойство объекта
});

console.log(users);
// [{id: 1, name: "ALICE"}, {id: 2, name: "BOB"}]
// массив структурно не изменился, но содержимое изменилось

3. Попытка переприсваивания элемента

const arr = [1, 2, 3];

arr.forEach((num, index) => {
  arr[index] = num * 2; // Это МЕНЯЕТ содержимое через index
});

console.log(arr); // [2, 4, 6] - содержимое изменилось

Это важная деталь: если вы присваиваете через индекс, вы МЕНЯЕТЕ исходный массив!

Ключевые различия

Не меняет forEach:

  • Длину массива
  • Порядок элементов
  • Саму переменную arr (её reference)

Может изменить forEach:

  • Свойства объектов внутри массива
  • Значения примитивных типов через직 присваивание по индексу
  • Любое содержимое, если это reference type (объект, массив)

Практический пример из реальной работы

// Антипаттерн: использование forEach для мутации
const orders = [
  {id: 1, status: "pending"},
  {id: 2, status: "completed"}
];

orders.forEach((order) => {
  order.status = "processed"; // Мутирует исходный массив
});

// Лучший подход: использовать map для создания нового массива
const processedOrders = orders.map((order) => ({
  ...order,
  status: "processed"
}));

Выводы

forEach - это метод побочных эффектов (side effects). Он:

  • Не возвращает новый массив
  • Не меняет структуру исходного массива
  • Может изменять содержимое элементов, если они reference types

В React и функциональном программировании рекомендуется избегать мутаций и использовать map, filter и другие чистые методы для преобразования данных.