객체가 얕은 복사가 되면 참조하는것이된다.
let obj = { a: 1, b: 2 };
let copy = obj;
copy.c = 3;
obj; //{ a: 1, b: 2, c: 3 }
Object.assign()
let obj = { a: 1, b: 2 };
let copy = Object.assign({}, obj); //concat마냥 붙인다.
let copy2 = { ...obj };
copy.c = 3;
obj; //{ a: 1, b: 2}
copy; //{ a: 1, b: 2, c: 3 }
copy2; //{ a: 1, b: 2}
하지만 객체안 프로퍼티가 객체라면 그것은 참조된다. 즉 깊은 복사가 아닌 한꺼풀만 복사하는 느낌
let obj = { a: 1, b: { name: "kyle", city: "seoul" } };
let copy = Object.assign({}, obj); //concat마냥 붙인다.
let copy2 = { ...obj };
obj.a = 0;
obj.b.city = "jeju";
obj; //{ a: 0, b: { name: 'kyle', city: 'jeju' } }
copy; //{ a: 1, b: { name: 'kyle', city: 'jeju' } }
copy2; //{ a: 1, b: { name: 'kyle', city: 'jeju' } }
하지만 큰 문제점이 있다.
JSON.stringify()
가 function
을 undefined
로 처리즉, 특수한 상황아니면 사용하면 안되보인다.
function deepCopy(obj) {
if (typeof obj !== "object" || obj === null) return obj;
let result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
result[key] = deepCopy(obj[key]);
}
return result;
}
lodash
라이브러리 사용
clone
: 얕은복사cloneDeep
: 깊은복사import lodash from "lodash";
const obj = [[1], [2], [3]];
const shallowCopyObj = lodash.clone(obj);
const deepCopyObj = lodash.cloneDeep(obj);