PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Какие плюсы и минусы подхода с immutable state?

Продвинутые темы

Плюсы immutable state: предсказуемость, простое отслеживание изменений, легко отменять/сравнивать. Минусы: накладные расходы на копирование, больше памяти, многословность.

Что такое immutable state

Состояние не изменяют, а создают новую версию при каждом обновлении:

// Не мутировать, а создавать новое
const next = { ...state, count: state.count + 1 };
const newArr = [...arr, item];

Плюсы

  • Предсказуемость — состояние не меняется неожиданно; легко рассуждать о коде.
  • Простое отслеживание изменений — сравнение по ссылке (prev !== next) мгновенно определяет изменение (основа React.memo, PureComponent, reselect):
prevState === nextState; // false → изменилось (O(1))
  • Time-travel / undo — легко хранить историю состояний (Redux DevTools).
  • Нет побочных эффектов — общие данные не портятся неожиданной мутацией.
  • Параллелизм — нет гонок при общих данных.

Минусы

  • Копирование — создание новых объектов при каждом изменении (spread, копии).
  • Больше памяти — старые версии + новые (хотя структурное разделение помогает).
  • Многословность — глубокие обновления требуют вложенного spread:
{ ...state, user: { ...state.user, name: 'Bob' } } // громоздко
  • Производительность — копирование больших структур дорого.

Как смягчить

  • Immer (Redux Toolkit) — писать «мутирующий» код, получать иммутабельное обновление.
  • Структурное разделение (Immutable.js) — переиспользование неизменённых частей.

Коротко для собеседования

Плюсы immutable state: предсказуемость, отслеживание изменений по ссылке (prev !== next за O(1) — основа memo/PureComponent/reselect), time-travel/undo, нет побочных мутаций. Минусы: копирование при каждом изменении (память, производительность), многословность глубоких обновлений. Смягчают через Immer (RTK) и структурное разделение (Immutable.js).

Другие вопросы раздела