JS

09 JS 참조에 의한 객체 복사

와라리요 2022. 10. 17. 16:04

 - 객체는 '참조에 의해' 저장되고 복사가 된다.

 

즉 객체는 그대로 저장되는 것이 아니라, 객체가 저장되어있는 '메모리 주소'인 객체에 대한 '참조 값'이 저장된다.

 

예)

let a = {};
let b = a; // 참조에 의한 복사

alert( a == b ); // true, 두 변수는 같은 객체를 참조합니다.
alert( a === b ); // true
let a = {};
let b = {}; // 독립된 두 객체

alert( a == b ); // false

 


 

객체 복사, 병합과 Object.assign

 - js에선 객체를 복제하는 일이 드물어 내장 함수가 존재하지 않습니다. 하지만 정말 복제가 필요한 상황이라면 새로운 객체를 만든 다음 기존 객체의 프로퍼티들을 순회해 원시 수준까지 프로퍼티를 복사하면 됩니다.

 

ex)

let user = {
  name: "John",
  age: 30
};

let clone = {}; // 새로운 빈 객체

// 빈 객체에 user 프로퍼티 전부를 복사해 넣습니다.
for (let key in user) {
  clone[key] = user[key];
}

// 이제 clone은 완전히 독립적인 복제본이 되었습니다.
clone.name = "Pete"; // clone의 데이터를 변경합니다.

alert( user.name ); // 기존 객체에는 여전히 John이 있습니다.

Object.assign

  - 여러 객체를 복사하여 합치는 방법이다. 동일한 키를 가진 프로퍼티가 있으면 마지막으로 실행된 값이 덮어 씌운다.

 

 문법)

Object.assign(dest, [src1, src2, src3...])

예)

let user = { name: "John" };

let permissions1 = { canView: true };
let permissions2 = { canEdit: true };

// permissions1과 permissions2의 프로퍼티를 user로 복사합니다.
Object.assign(user, permissions1, permissions2);

// now user = { name: "John", canView: true, canEdit: true }

 


 

중첩 객체 복사

 - 만약 객체 안에 다른 객체가 있으면 Object.assign를 이용해도 안의 객체는 복사되지 않고 공유하게 된다. 만약 이 문제를 해결하고 싶으면 user[key]의 각 값을 검사하면서, 그 값이 객체인 경우 객체의 구조도 복사해주는 반복문을 사용해야 합니다. 이런 방식을 '깊은 복사(deep cloning)'라고 합니다.

 

예)

let user = {
  name: "John",
  sizes: {
    height: 182,
    width: 50
  }
};

let clone = Object.assign({}, user);

alert( user.sizes === clone.sizes ); // true, 같은 객체입니다.

// user와 clone는 sizes를 공유합니다.
user.sizes.width++;       // 한 객체에서 프로퍼티를 변경합니다.
alert(clone.sizes.width); // 51, 다른 객체에서 변경 사항을 확인할 수 있습니다.

 

'JS' 카테고리의 다른 글

11 JS 메서드와 this  (0) 2022.10.20
10 JS 가비지 컬렉션  (0) 2022.10.18
08 JS 객체  (0) 2022.10.11
07-2 JS 다양한 함수  (0) 2022.10.07
07-1 JS 함수  (2) 2022.10.07