dolog

참조에 의한 객체 복사 본문

JavaScript/객체 : 기본

참조에 의한 객체 복사

dokite 2022. 7. 18. 00:30
  • 원시 타입 : 값 그대로 저장과 할당, 복사가 가능
  • 객체 타입 : 객체가 저장되어 있는 메모리 주소 인 객체에 대한 참조값(by reference)이 저장

 

ex)

let user = {

name: “John”

}

 

객체는 메모리 내 어딘가에 저장되고 변수 user엔 객체를 참조할 수 있는 값이 저장 ➡️ 객체가 할당된 변수를 복사할 땐 객체의 참조값이 복사

 

ex) 

let user = { name : “John” };

let admin = user; // 참조값을 복사

 

admin.name = “Pete”;

 

console.log(user.name);

 

변수는 두개지만 각 변수엔 동일 객체에 대한 참조 값이 저장

 

따라서 객체에 접근하거나 객체를 조작할 땐 여러 변수를 사용할 수 있습니다

 

참조에 의한 비교

  • == 와 === 는 동일하게 동작한다
  • 비교하는 두 객체가 동일한 객체인 경우 true 반환
  • 대소비교나 원시값과의 비교에선 객체가 원시형으로 변환(코딩 실수로 생기는 상황)

 

ex)

let a = {};

let b = a;

 

console.log( a == b ); // true

console.log( a === b ); // true 

 

let a = {};

let b = {};

 

console.log( a == b ) // 각각 독립된 객체이기 때문에 false

 

객체 복사, 병합과 Object.assign

  • 객체를 복제하는 경우는 드물지만 필요한 상황인 경우

ex)

let user = {

name: “John”,

age: 30

};

 

let clone = {};

 

// clone 객체에 user 프로퍼티 전부 복사

for(let key in user) {

clone[key] = user[key];

}

 

clone.name = “Pete”; // clone의 데이터를 변경

console.log(user.name) // John

 

  • Object.assign : 여러 객체를 하나로 병합

ㄴ 얕은 복사(shallow copy)

ㄴ 중첩 객체 처리 X

 

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

a. dest는 목표로 하는 객체

b. 인수 src1, src2…는 복사하고자 하는 객체

c. 객체 src1, src2…의 프로퍼티를 dest에 복사, dest를 제외한 인수의 프로퍼티전부가 첫번째 인수로 복사

d. 마지막으로 dest 반환

 

 ex)

let user = { name: “John” };

 

let permission1 = { canView: true };

let permission2 = { canEdit: true };

 

// permission1 와 permission2의 프로퍼티를 user로 복사

Object.assign(user, permission1, permission2)

 

// user = { name: “John”, canView: true, canEdit: true }

 

ex) 목표 객체에 동일한 이름을 가진 프로퍼티가 있는 경우

 

let user = { name: "John" };

 

Object.assign(user, { name: "Pete" });

 

console.log(user.name); // user = { name: "Pete" } , 덮어씌운다

 

ex) Object.assign을 사용하여 반복문 없이도 간단하게 객체 복사

 

let user = {

name: “John”,

age: 30

};

 

let clone = Object.assign({}, user); // user에 있는 모든 프로퍼티가 {}에 복사, clone 변수에 할당

 

중첩 객체 복사

  • 프로퍼티가 다른 객체에 대한 참조 값이라면?

 

ex)

let user = {

name: “John”,

sizes: {

height: 182,

width: 50

}

};

 

console.log(user.sizes.height); // 182

 

ex) clone 에 객체를 복제하려면

 

let user = {

name: “John”,

sizes: {

height: 182,

width: 50

}

};

 

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

 

console.log(user.sizes === clone.sizes); // true

 

// user와 clone은 sizes를 공유한다

user.sizes.width++; // 한 객체에서 프로퍼티 변경

console.log(clone.sizes.width); // 다른 객체에서 변경 사항 확인 가능

 

깊은 복사(deep cloning)

: object[key]의 각 값을 검사하면서, 그 값이 객체인 경우 객체의 구조도 복사해주는 반복문을 사용

 

자바스크립트 라이브러리 lodash 매서드 _.cloneDeep(obj) ➡️ 직접 알고리즘 구현하지 않고 처리가능

'JavaScript > 객체 : 기본' 카테고리의 다른 글

매서드와 this  (0) 2022.07.20
가비지 컬렉션 2  (0) 2022.07.20
가비지 컬렉션 1  (0) 2022.07.19
객체 2  (0) 2022.07.17
객체 1  (0) 2022.07.15