#Фронтенд
Здарова, работяги!
В js существует страшилка, что нельзя мутировать объекты. Ей пугают новичков с самых первых шагов. Давайте с ней разбираться.
Почему она возникла? Какое-то время назад, когда качество js кода было сильно хуже чем сейчас я часто встречал в коде мутации объектов. В большинстве случаев мутации приводили к очень коварным багам. Прям оччччень противным. Чуть позже в js сообществе начала форситься тема о запрете мутации. И это оправдано, ведь в большинстве случаев мутация = говнокод.
Но все это привело к другой проблеме - полный отказ от мутации, совсем. Да, кто-то скажет это не проблема. Но я так не считаю. Сейчас очень активно, особенно новички, при каждой попытке изменить объект использует спред
{...yourObject}. И многие воспринимают это прям как истинное добро и свет. Но есть проблема, операция {...yourObject} не отличается производительностью. Поэтому важно знать где нужно, а где ненужно мутировать. Это поможет избавиться от лишних спредов.Самый популярный кейс избыточной иммутабильности это создание объекта на основе массива с помощью reduce(reduceRight). Большинства используют его как-то так:
array.reduce((acc, element) => ({ ...acc, [element.id]: element }), {}) Если остановиться и проанализировать этот код, то мы пытаемся спасти от мутации объект, который еще нигде не используется. Тк при запуске такого кода последовательность следующая: создание нового объекта => заполнение его свойств => складываем ссылку на него в переменную => потом где-то используем.
Важно! Мутация опасно тогда, когда объект мутирует после того, как кто-то начал его использовать, кто-то уже получит ссылку на него. В нашем же примере новый объект будет мутироваться до использования, а это полностью безопасно. Пример без спреда на скрине.
