Чтобы иметь в виду неизменность, вы можете думать о своих ценностях как о примитивах.
1 === 2 // false
'hello' === 'world' // false
Вы можете распространить этот способ мышления и на не примитивов
[1, 2, 3] === [1, 2, 3] // false
{ username: 'hitmands' } === { username: 'hitmands' } // false
, чтобы лучше понять это, пожалуйста, посмотрите на MDN - Сравнения равенства и одинаковость
как заставить неизменность?
Всегда возвращая новый экземпляр данного объекта!
Допустим, мы должны установить свойство status
задачи. По-старому мы бы просто сделали:
todo.status = 'new status';
но мы могли бы принудительно установить неизменность, просто скопировав данный объект и вернув новый.
const todo = { id: 'foo', status: 'pending' };
const newTodo = Object.assign({}, todo, { status: 'completed' });
todo === newTodo // false;
todo.status // 'pending'
newTodo.status // 'completed'
возвращаясь к вашему примеру, вместо того, чтобы делать obj.count = ...
, мы просто сделаем:
Object.assign({}, obj, { count: ... })
// or
({ ...obj, count: /* something */ })
есть библиотеки, которые помогут вам с неизменным шаблоном:
- Immer
- ImmutableJS