Как сделать объект немутабельным в JavaScript
Что проверяют
Знаете ли вы разницу между неизменяемой ссылкой и неизменяемым объектом и где встроенные средства заканчиваются. Следом почти всегда спрашивают про вложенные объекты и про то, как иммутабельность устроена в React или Redux.
Как отвечать
Начните с того, что const запрещает только переприсваивать переменную, содержимое объекта при этом меняется свободно. Встроенные уровни защиты:
Object.preventExtensions: нельзя добавлять свойства, удалять и менять можно;Object.seal: нельзя добавлять и удалять, существующие значения менять можно;Object.freeze: нельзя ничего, все свойства становятсяwritable: falseиconfigurable: false. Проверяется черезObject.isFrozen.
Важные детали поведения. В нестрогом режиме запись в замороженный объект молча игнорируется, в строгом бросает TypeError, а модули ES и тела классов всегда строгие. Заморозка поверхностная: Object.freeze(user) не защищает user.address.city, для полной защиты нужен рекурсивный deepFreeze. Внутреннее состояние Map, Set и Date заморозка не трогает, frozenMap.set() сработает.
Дальше скажите, что на практике иммутабельность во фронтенде чаще про стиль обновления, а не про заморозку. Новое состояние создают копией: { ...state, user: { ...state.user, name } }, методы массивов без мутаций map, filter, toSorted, toSpliced, with, глубокую копию даёт structuredClone. React сравнивает состояние по ссылке, поэтому мутация на месте не вызывает перерендер. В Redux Toolkit редьюсеры пишут «мутирующим» кодом, а Immer под капотом строит новую копию. TypeScript даёт readonly, Readonly<T> и as const, но это проверка компилятора, в рантайме объект остаётся изменяемым.
Где спотыкаются
Говорят, что const делает объект неизменяемым. Это самая частая ошибка на вопросе.
Не знают, что Object.freeze поверхностный, и уверены, что вложенный объект тоже защищён.
Путают заморозку и копирование: замораживают состояние и потом пытаются его «обновить», вместо того чтобы создать новый объект. Или, наоборот, копируют спредом объект с вложенностью и мутируют вложенную часть, которая осталась общей ссылкой у копии и оригинала.