얕은 복사와 깊은 복사에 대해 알아보기 전에 잠시 데이터 타입을 짚고 넘어가자.
기본형(primitive) 타입: number, string, boolean, undefined, null 등
참조형(reference) 타입: object, array, function, date, regexp 등
결론부터 말하자면
얕은 복사: 객체의 참조값(주소)를 복사
깊은 복사: 객체의 값 자체를 복사
예시와 함께 자세히 살펴보자.
얕은 복사 (Shallow Copy)
1. Object.assign()
var obj1 = {
a: 10,
b: {
c: 'abc',
},
};
var obj2 = Object.assign({}, obj1);
obj2.a = 20;
obj2.b.c = 'def';
console.log(obj1); // { a: 10, b: { c: "def" } }
console.log(obj2); // { a: 20, b: { c: "def" } }
2. for ... in
var copyShallo = function (obj) {
var result = {};
for (var prop in obj) {
result[prop] = obj[prop];
}
return result;
};
깊은 복사 (Deep Copy)
1. 재귀함수를 이용한 복사
const obj = {
a: 1,
b: {
c: 2,
},
};
function copyObj(obj) {
const result = {};
for (let key in obj) {
if (typeof obj[key] === 'object') {
result[key] = copyObj(obj[key]);
} else {
result[key] = obj[key];
}
}
return result;
}
const copiedObj = copyObj(obj);
copiedObj.b.c = 3
obj.b.c === copiedObj.b.c //false
2. JSON.stringify()
const obj = {
a: 1,
b: {
c: 2,
},
};
const copiedObj = JSON.parse(JSON.stringify(obj));
copiedObj.b.c = 3
obj.b.c === copiedObj.b.c //false
'Frontend > HTML ∙ CSS ∙ JavaScript' 카테고리의 다른 글
[JS] Uncaught SyntaxError: Cannot use import statement outside a module 에러 해결 (0) | 2024.11.29 |
---|---|
[JS] toLocaleString()를 사용하여 날짜를 원하는 포맷의 문자열로 저장하기 (0) | 2024.11.29 |
[JS] crypto.randomUUID()를 사용하여 자바스크립트로 랜덤 id 생성하기 (2) | 2024.11.29 |
[JavaScript] ==와 ===의 차이 (0) | 2023.11.06 |
[CSS] Flexbox 속성 배우기 게임, Flexbox Froggy 🐸 (0) | 2023.10.26 |