Say you have an object obj = { a : [1, 2] }
and you create a clone of it objClone = Object.assign({}, obj)
and when you modify Object.values(objClone)[0][1], then the parent obj is also modified. Can someone explain why?
Asked
Active
Viewed 148 times
-1

Maksymas
- 9
- 2
-
3`Object.assign()` makes a **shallow copy** of the source object. – Pointy Apr 14 '20 at 05:05
-
But changing Object.values(objClone)[0] doesn't change the parent object. Can you explain why @Pointy – Maksymas Apr 14 '20 at 05:08
-
Because `Object.values()` also makes a shallow copy. – Pointy Apr 14 '20 at 05:11
-
`Object.values` returns a *new* array reference, but all the elements (shallowly copied) still refer to the original elements, thus if you mutate a value in the "copied" array it mutates the same value reference in the original array. – Drew Reese Apr 14 '20 at 05:11
1 Answers
1
In:
let objA = { a : [1, 2] }
the value of objA.a
is a reference to the array created by the array literal. So when you copy the object:
let objB = Object.assign({}, objA)
then the value of objB.a
is a copy of the value of objA.a
, so is a reference to the same array.
That is often referred to as a "shallow copy", that is, it's just a simple copy of the value without resolving references to copy whatever they reference.
When you do:
console.log(objA.a)
then the reference is resolved so it prints the contents of the array, not the actual value of the reference (which would be a bit useless).

RobG
- 142,382
- 31
- 172
- 209