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

Hannahhh·2022년 7월 13일
0

JavaScript

목록 보기
17/47

데이터를 전달할 때 원시 자료형(Primitive type data)value를 복사하여 전달하고,(Call by Value)

참조 자료형(Reference type data)reference를 전달한다. (Call by Reference)

링크텍스트



👀 얕은 복사(Shallow Copy)

참조 자료형을 복사하는 경우 일어나며, 원본 객체가 담겨있는 변수를 새로운 변수에 할당했을 때 값이 아닌 주소값을 전달한다. 따라서, 동일한 주소를 공유하고 있기 때문에 둘 중 하나의 변수에서 값의 변경이 일어나면 다른 변수의 값에도 영향을 준다.

let obj = {a: 1, b: 2};
let obj1 = obj;

obj1.a = 3;

console.log(obj1.a);   // 3



👀 깊은 복사(Deep Copy)

Object.assign()

열거할 수 있는 하나 이상의 원본 객체로부터 다른 객체로 속성을 복사할 때 사용하며, 대상 객체를 반환하는 메서드로, 객체를 쉽게 병합할 수 있게 한다.

let obj = { a: 1, b: 2, c: {c1: 3, c2: 4}};
let obj1 = Object.assign({}, obj);

obj1.a = 3;

console.log( obj === obj1 ) // false
console.log( obj.a ) // 1

console.log( obj.c === obj1.c ) // true..? (shallow copy)

단, 예시와 같이 객체안에 객체가 있는 경우(2차원 객체) 얕은 복사가 이루어지기 때문에 완벽한 깊은 복사가 아니다.


Spread Operation

spread 문법을 이용한 방법이다.

let obj = { a: 1, b: 2, c: {c1: 3, c2: 4}};
let obj1 = { ...obj };

obj1.a = 3;

console.log( obj === obj1 ) // false
console.log( obj.a ) // 1

console.log( obj.c === obj1.c ) // true..? (shallow copy)

Object.assign()과 마찬가지로 2차원 객체가 있다면 얕은 복사가 이루어지기 때문에 완벽한 깊은 복사라 할 수 없다.

✔ 완벽한 깊은 복사를 하기 위해서 사용할 수 있는 방법은?

  • JSON.parse()/JSON.stringity()
  • loadash 의 .clone & .cloneDeep 메서드
  • 복사 재귀 함수 만들어서 사용


0개의 댓글