Object.assign() 메소드를 MDN에 찾아보면 열거할 수 있는 하나 이상의 출처 객체로부터 대상 객체로 속성을 복사할 때 사용합니다. 대상 객체를 반환합니다. (객체를 병합)
Object.assign(target, ...sources)
여기소 sources는 target에 병합됩니다. 그리고 return 값으로 target을 반환합니다.
ex)
let obj1 = {a: 1}
let obj2 = {b: 2}
let obj3 = {c: 3}
let newObj = Object.assign({}, obj1, obj2, obj3)
// output: newObj {a: 1, b: 2, c: 3}
빈 객체안에 obj1,obj2,obj3가 빈객체에 병합됩니다.
그렇다면 target에 빈객체가 아니라 이미 존재하는 객체를 넣으면
ex)
let obj1 = {a: 1}
let obj2 = {b: 2}
let obj3 = {c: 3}
let newObj2 = Object.assign(obj1, obj2, obj3)
// output: newObj2 {a: 1, b: 2, c: 3}
// obj1 {a: 1, b: 2, c: 3}
그 결과 newObj2에 obj1,obj2,obj3를 모두 병합한 결과가 나옵니다. 그러나 target인 obj1도
{a: 1, b: 2, c: 3} 된 것을 알수 있습니다.
추가로
newObj2['d'] = 4
// output: newObj2 {a: 1, b: 2, c: 3, d: 4}
// obj1 {a: 1, b: 2, c: 3, d: 4}
newObj2에 {d:4}를 추가하면 obj1에도 그대로 추가되는 것을 볼 수 있습니다.
따라서 Object.assign의 메서드의 결과가 새로운 객체를 반환해야한다면, 타깃으로는 빈 객체를 주어야합니다.