Assigning, Mutating, and Freezing a JS object
I've been using Object.assign
to merge two objects in javascript. That typically looks like this:
> let o = Object.assign({a: 1, b: 2}, {a: 3})
{a: 3, b: 2}
The key/values in the second argument override the key/values in the first object to produce a new object with those the combined keys and values.
Does it actually produce a new object? or does it just mutate the first argument:
> foo = {a: 1, b: 2}
> bar = Object.assign(foo, {a: 3})
> foo == bar
true
> foo
{a: 3, b: 2}
Ahh... it mutates. If you prefer something not to mutate you can freeze it:
> foo = {a: 1}
> bar = Object.freeze(foo)
> Object.assign(bar, {a: 2})
TypeError: Cannot assign to read only property 'a' of object '#<Object>'
Ok, so now Object.assign
can't mutate the first argument, because that argument is frozen. But be careful, freeze
mutates too.
> Object.assign(foo, {a: 2})
TypeError: Cannot assign to read only property 'a' of object '#<Object>'
Tweet