Какие плюсы и минусы подхода с 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).