Learn how to use Object.assign() and the spread operator proposed for ES7 to avoid mutating objects.
Yes, it will make a shallow copy. If you change a single field on it, it would not be a problem because you want to keep all other properties the same even if they are nested objects. Shallow copy is exactly what you need when you change a specific single field.
However if you want to perform a deep change it will be more complicated: you will need to shallowly copy all objects “on the way to” that change. This is exactly where you’d use the reducer composition pattern again, to delegate updating some field to a subreducer.
It seems the spread operator in object deconstruction is not supported by ES6.
somehow I can't use the wzrd source in the script tags anymore, I only get expect is not defined AND when I try to go to https://wzrd.in, google chrome blocks it (privacy error). Also for the link: https://wzrd.in/standalone/expect@latest. Which can I use to make this work again for me (using jsbin)