원본 객체의 속성과 값을 새로운 객체에 그대로 할당하면, 그것은 얕은 복사가 된다.
가령 다음과 같이 구현할 수 있다.
const obj = {
a:1,
b:2,
c:{
d:1
}
};
const copy = {};
for(let key in obj){
copy[key] = obj[key];
};
console.log(copy.a, obj.a);// 1 1
console.log(copy.b, obj.b);// 2 2
copy.c.d = 3;
console.log(copy.c.d, obj.c.d);// 3 3
let copy = Object.assign({},obj)
copy.c.d
의 값을 바꿨는데, 원본 obj.c.d
값까지 바뀌었다.
이는, 프로퍼티 값이 객체이면 객체의 주소를 복사하기 때문이다. 따라서, copy.c
와 obj.c
는 같은 객체를 참조하기때문에 함께 바뀌어버리게 된다. 얕은 복사는 프로토타입, 객체 설명자를 복사하지 않는다.
깊은 복사는 원본 객체를 완전하게 copy하며, 프로퍼티가 객체인 경우에 새로운 메모리 공간을 통해 복사한다.
function deepCopy(obj) {
if (obj === null || typeof(obj) !== "object") {
return obj;
}
let copyObj = {};
for(let key in obj) {
copyObj[key] = deepCopy(obj[key]);
}
return copyObj;
}
깊은 복사를 하는 방법은 이외에도 JSON
을 이용한방식, 라이브러리를 이용하는 방식이 있다.
let copyObj = JSON.parse(JSON.stringify(obj));
JSON
방식으로 깊은 복사를 하면, 간단하게 깊은 복사를 할 수 있다. 하지만, 프로퍼티에 함수가 할당되어 있다면 복사가 안되기 때문에 조심해야 한다.