본문 바로가기
JavaScript

JavaScript 객체의 동작방식

by 하이방가루 2022. 2. 10.
728x90
반응형

원시 타입 - 문자열, 숫자, 불린 값, null, unsigned)

객체 - 프로퍼티 key : value 들로 구성된 데이터 집합 또는 복잡한 개체

원시값은 값 그대로 저장,할당되고 복사되는 반면에,

객체는 참조에 의해(by reference : 객체가 저장되어있는 '메모리 주소')저장되고 복사된다.

따라서 객체를 복사하여 같은 키값을 가지고 있을 때,

그 키의 값을 바꾸면 원본과 복사된 객체 모두의 키값이 바뀐다.

let user = { name : 'Mike' };
let admin = user;
admin.name = 'Jack';
alert( user.name ); // Jack이 출력됨.

참조값을 복사하기 때문에 동일한 객체를 만들었다하더라도

복사된 객체가 아니면 동등 연산자나 일치 연산자 모두 거짓을 반환한다.

let a = {};
let b = {};

alert( a==b ); // false

a = b;

alert( a==b );   // true
alert( a===b ); // true

만약 독립적인 복제본을 만들려고 한다면 각 프로퍼티를 전부 복사해 넣으면된다.

for(let key in user) {
  clone[key] = user[key];
}

또는 Object.assign를 사용하는 방법도 있다.

let clone = {};

Object.assign(clone, user);

한 줄로 작성할 수도 있다.

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

Object.assign을 이용하면 여러 객체를 하나로 병합할 수 있다.

하지만 동일한 키를 가진 프로퍼티가 있는 경우에는 기존 값이 덮어씌어 진다.

let user = { name: 'Jack' };
let user2 = { name: 'Mike' }
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };

Object.assign(user, permission1, permission2, user2);  // user = { name: 'Mike', canView: true, canEdit: true}

이러한 복사방법을 얕은 복사라 하며 이 경우 객체 내에 객체가 있을 경우 참조값이 복사된다.

이 문제를 해결하려면 각 프로퍼티가 객체인지 아닌지 검사하고 객체인 경우 객체의 구조도 복사주는 반복문을 사용하는 깊은 복사를 해야한다.

function makeCloneObj(obj) {
 let result = {};

  for(let key in obj){
    if(typeof(obj[key])=='object') result[key] = makeCloneObj(obj[key]);
    else result[key] = obj[key];
  }

  return result;
}

자바스크립트 라이브러리 Lodash의 매서드인 _.cloneDeep(obj)을 사용하면 이 알고리즘을 직접 구현하지 않고도 깊은 복사를 처리할 수 있다.

728x90
반응형

'JavaScript' 카테고리의 다른 글

JavaScript this와 체이닝  (0) 2022.02.10
JavaScript 가비지 컬렉션  (0) 2022.02.10
JavaScript break/continue와 레이블  (0) 2022.01.20
JavaScript nullish병합연산자 '??'  (0) 2022.01.19
JavaScript 논리연산자  (0) 2022.01.19

댓글