As alluded to in the intro, immutability also makes sense in Javascript.
The idea is to create shallow copies of objects. For example, the code below returns an object that's a shallow copy of the todos (that's what the object spread operator does), then overrides the todo with the latest copy.
function updateTodo(todos, todo) {
return {...todos, [todo.id]: todo}
}
This approach is perfect for toy apps and quick prototypes.
One drawback is that it's error prone---it is very easy to forget to use
Object.assign
/the spread operator, and the code still works until
it throws weird bugs. The other issue is that you're creating shallow copies of objects---
this quickly becomes inefficient as soon as your data grows.
ImmutableJS is easy to use and performant. It's also very popular.