Что такое иммутабельность в JavaScript
Что проверяют
Понимаете ли вы, почему библиотеки интерфейса решают, что перерисовывать, сравнивая ссылки, и что из этого следует для повседневного кода. Вопрос базовый, но быстро выводит на реальные баги: компонент не обновился, хотя данные поменялись, или, наоборот, перерисовывается весь список на каждый рендер.
Как отвечать
Иммутабельность это договорённость не менять существующее значение, а создавать новое. В самом языке она не встроена: const запрещает переприсвоить переменную и никак не защищает содержимое объекта, а Object.freeze замораживает только верхний уровень, вложенные объекты остаются изменяемыми.
Отсюда правило обновления: копируется весь путь до изменённого узла, а не только он сам. Если родитель остался прежней ссылкой, сравнение изменения не увидит.
const next = { ...state, user: { ...state.user, name } };Стоит помнить, какие методы массива меняют оригинал (push, splice, sort, reverse), а какие возвращают новый (map, filter, slice, concat, а также современные копирующие варианты сортировки и замены элемента).
Зачем это нужно: сравнение по ссылке дешевле глубокого, поэтому работают мемоизация и зависимости хуков; появляется история состояний для отмены действия; значение нельзя незаметно испортить из чужого кода. Цена тоже есть: лишние аллокации и многословность при глубокой вложенности. Лечится это нормализацией состояния в плоский вид или библиотекой с черновиком, где мутирующий на вид код собирает новый объект.
Где спотыкаются
Считают const гарантией неизменности. Массив под const прекрасно принимает push, объект принимает новое свойство: запрещено только переприсваивание самой переменной.
Сортируют массив прямо из состояния. Метод меняет оригинал, ссылка остаётся прежней, перерисовки нет, а данные в хранилище уже испорчены, и источник бага ищут потом в другом месте.
Бросаются в обратную крайность и собирают новый объект или массив в теле компонента, передавая его в мемоизированного потомка. Мемоизация обнуляется на каждом рендере, а такой же объект в зависимостях эффекта даёт бесконечный цикл.