Today I Learn : 2024-06-10
# 참조에 의한 객체 복사
- 객체와 원시 타입의 근본적인 차이 중 하나
1) 객체 : 참조에 의해 저장되고 복사된다.
2) 원시 타입 : 원시값(문자열, 숫자, 불린값)은 값 그대로 저장, 할당되고 복사된다.
let message = 'Hello!';
let phrase = message;
- 두 개의 독립된 변수에 각각 문자열 'Hello!'가 담긴다.
- 변수엔 객체가 그대로 젖아되는 것이 아니라, 객체가 저장되어있는 '메모리 주소'인 객체에 대한 '참조값'이 저장된다.
let user = {
name: 'kim'
};
- 객체는 메모리 내 어딘가에 저장되고, 변수 user엔 객체를 참조할 수 있는 값이 저장된다.
- 개체가 할당된 변수를 복사랄 땐 객체의 참조 값이 복사되고 객체는 복사되지 않는다.
let user = { name: 'kim' };
let admin = user; // 참조값을 복사
- 변수는 2개이지만 각 변수엔 동일 객체에 대한 참조 값이 저장된다.
- 따라서 객체에 접근하거나 객체를 조작할 땐 여러 변수를 사용할 수 있다.
let user = { name: 'kim' };
let admin = user;
admin.name = 'lee';
console.log(user.name); // 'lee'출력, user 참조값을 이용해 변경사항을 확인
# 참조에 의한 비교
- 객체 비교 시 동등 연산자 == 와 일치연산자 ===는 동일하게 도작
- 비교 시 피연산자인 두 객체가 동일한 객체인 경우에 참을 반환
- 두 객체 모두 비어있다는 점에서 같아 보이지만, 독립된 객체이기 때문에 일치.동등 비교하면 거짓을 반환한다.
let a = {};
let b = a; // 참조에 의한 복사
console.log(a == b); // true
console.log(a === b); // true
let a = {};
let b = {}; // 독립된 두 개체
console.log(a === b); // false
- obj1 > obj2 같은 대소 비교나 obj == 5같은 원시값과의 비교에선 객체가 원시형으로 변한다.
# 객체 복사, 병합과 Object.assign
객체가 할당된 변수를 복사하면 동일한 객체에 대한 참조 값이 하나 더 만들어진다.
- 복제가 필요한 상황이 된다면 새로운 객체를 만든 다음 기존 객체의 프로퍼티들을 순회해 원시 수준까지 프로퍼티를 복사하면 된다.
-