할당을 하여 같은 주소값을 바라보게 되는 복사이다.원본을 변경하면 복사본이, 복사본을 변경하면 원본이 변경된다.
1.slice()
2.spread문법
3.Object.assign()
요런 세가지 방법등이 있는데, 이러한 방법을 이용해 복사를 하면 단순객체복사와 다르게 같은 참조값을 보지않아 원본을 변경하면 복사본이, 복사본을 변경하면 원본이 변경되지 않지만 2depth이상이면 2depth는 복사하지 못한다.
즉, 2중으로 객체안에 객체가 들어갔을때 내부객체는 원본과 복사본이 서로 같은 주소값을 바라 보고 있어, 완벽하게 깊은 복사를 하지 못한다.
1.JSON.parse(JSON.stringify(원본))
2.라이브러리 이용
JSON.stringify() 메소드는 인수로 객체를 받으며 받은 객체는 문자열로 치환되며, JSON.parse() 메소드는 문자열을 인수로 받으며, 받은 문자열을 객체로 치환한다.
대부분의 경우 얕은복사로도 충분하지만, 객체안에 객체가 있는 경우엔 깊은 복사가 필요하다.
JSON.parse(JSON.stringify(원본))를 이용하면 이중객체까지 깊은 복사가 가능하지만, 이 방법은 성능이 좋지 않고 깊은복사는 보통 라이브러리를 이용한다. 하지만, 가장 간단한 방법이다.
const test1 = {
bravo: {
delta: 1
}
}
const test2 = {
bravo: {
charlie: 2
}
}
const answer1 = Object.assign(test1, test2);
const answer2 = {...test1, ...test2};
console.log(answer1)
console.log(answer2)
{ bravo: { charlie: 2 } }
{ bravo: { charlie: 2 } }
spread 연산자로 객체를 묶어줄 경우 depth 1까지는 확실하게 deep copy가 되는것은 맞으나 depth가 2 이상이 되는 경우 shallow copy가 발생하고 shallow copy는 동일한 depth선상에 있는 동일한 key 값을 대체해버리는 것이라고 설명할 수 있을 것 같다.