객체의 1차 필드만 복사하고, 중첩된 객체(또는 배열)는 참조를 복사한다.
즉, 원본 객체와 복사된 객체가 동일한 중첩된 객체를 참조하게 된다.
원본 객체의 중첩된 객체를 수정하면 복사본에서도 수정된 값이 반영된다.
메모리 공간을 절약하지만, 참조로 인한 의도치 않은 데이터 변경 가능성이 있다.
const original = { a: 1, b: { c: 2 } };
// 얕은 복사
const shallowCopy = { ...original };
// 값 변경
shallowCopy.a = 100;
shallowCopy.b.c = 200;
console.log(original); // { a: 1, b: { c: 200 } }
console.log(shallowCopy); // { a: 100, b: { c: 200 } }
객체의 모든 레벨(중첩된 객체, 배열 등)의 값을 복사한다.
복사된 객체는 원본 객체와 완전히 독립적인 메모리를 가진다.
원본 객체와 복사본이 완전히 독립적이다.
메모리 사용량이 증가할 수 있지만, 데이터 충돌 위험을 방지할 수 있다.
단순한 객체나 배열에 대해 깊은 복사를 수행한다.
단점: 함수, undefined, 순환 참조가 포함된 객체를 처리하지 못한다.
const original = { a: 1, b: { c: 2 } };
// 깊은 복사
const deepCopy = JSON.parse(JSON.stringify(original));
// 값 변경
deepCopy.a = 100;
deepCopy.b.c = 200;
console.log(original); // { a: 1, b: { c: 2 } }
console.log(deepCopy); // { a: 100, b: { c: 200 } }
const _ = require('lodash');
const original = { a: 1, b: { c: 2 } };
// 깊은 복사
const deepCopy = _.cloneDeep(original);
// 값 변경
deepCopy.b.c = 200;
console.log(original); // { a: 1, b: { c: 2 } }
console.log(deepCopy); // { a: 1, b: { c: 200 } }
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
const clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
const original = { a: 1, b: { c: 2 } };
// 깊은 복사
const deepCopy = deepClone(original);
// 값 변경
deepCopy.b.c = 200;
console.log(original); // { a: 1, b: { c: 2 } }
console.log(deepCopy); // { a: 1, b: { c: 200 } }
얕은 복사: 간단한 객체와 배열에서 사용하며, 중첩된 데이터 구조가 없거나 복사를 위한 성능이 중요한 경우 적합하다.
깊은 복사: 중첩된 데이터 구조나 원본 객체와의 독립성이 중요한 경우 적합하다.