foundation
Иммутабельность
Используйте structural sharing и иммутабельные обновления, чтобы change detection, история и отладка оставались надёжными.
Иммутабельные обновления возвращают новые ссылки на изменённые ветки и разделяют неизменённые поддеревья (structural sharing). React, Redux и time-travel опираются на неравенство ссылок для обнаружения изменений.
const state = { user: { id: 'u1' }, prefs: { theme: 'dark' } };
const next = {
...state,
prefs: { ...state.prefs, theme: 'light' },
};
// state !== next; state.user === next.user
Redux Toolkit через Immer позволяет писать reducer «как с мутацией», получая иммутабельный результат. MobX часто мутирует observables напрямую — другая модель изменений, та же потребность в явных границах обновления.
Компромисс: предсказуемый change detection и time-travel debugging против стоимости аллокаций и многословных обновлений.
На интервью: какие ссылки меняются после вложенного update; объясните structural sharing.
Типовые ошибки: in-place `sort`/`splice` массива, мутация вложенных объектов в `useState`, shallow spread с общими внутренними объектами, которые потом мутируют.
Чеклист:
- Заменяйте изменённые ветки; остальное разделяйте.
- Копируйте массивы/объекты перед in-place методами.
- Immer или утилиты для глубоких деревьев.
- Проверяйте допущения о равенстве ссылок в селекторах.