[JavaScript] 얕은 복사와 깊은 복사

2023. 11. 6. 01:46·Frontend/HTML ∙ CSS ∙ JavaScript

 

얕은 복사와 깊은 복사에 대해 알아보기 전에 잠시 데이터 타입을 짚고 넘어가자. 

기본형(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 생성하기  (3) 2024.11.29
[JavaScript] ==와 ===의 차이  (0) 2023.11.06
[CSS] Flexbox 속성 배우기 게임, Flexbox Froggy 🐸  (0) 2023.10.26
'Frontend/HTML ∙ CSS ∙ JavaScript' 카테고리의 다른 글
  • [JS] toLocaleString()를 사용하여 날짜를 원하는 포맷의 문자열로 저장하기
  • [JS] crypto.randomUUID()를 사용하여 자바스크립트로 랜덤 id 생성하기
  • [JavaScript] ==와 ===의 차이
  • [CSS] Flexbox 속성 배우기 게임, Flexbox Froggy 🐸
jisunipark
jisunipark
일신우일신 | 日新又日新 압축성장 중인 개발자입니다.
  • jisunipark
    일신우일신
    jisunipark
    • 분류 전체보기 (89)
      • Frontend (12)
        • HTML ∙ CSS ∙ JavaScript (8)
        • React.js (4)
        • Next.js (0)
      • Backend (5)
        • Express.js (2)
        • Flask (3)
      • Language (27)
        • Python (24)
        • Java (3)
        • Kotlin (0)
      • Etc. (3)
        • Git ∙ GitHub (3)
      • 개발서적 (19)
        • 모던 자바스크립트 Deep Dive (16)
        • 리팩터링 2판 (3)
      • 스터디 (6)
        • JavaScript30 (5)
        • 독서 스터디 (1)
      • 배움과 성장 (4)
        • 컨퍼런스 ∙ 세미나 (1)
        • 생각 기록 (3)
      • 회고 (5)
      • English ver. (4)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
jisunipark
[JavaScript] 얕은 복사와 깊은 복사
상단으로

티스토리툴바