우선 자바스크립트의 데이터 타입은 기본형과 참조형으로 나뉜다.
기본형과 참조형을 구분하는 기준은 무엇일까?
⇒ 대개 기본형은 할당, 연산시 복제한다 하고, 참조는 참조시 복제한다고들 한다.
하지만, 둘 모두 복제를 한다. 다만 그 복제 대상이 다를 뿐이다.
기본형은 값이 담긴 주소값을 복제한다.
참조형은 값이 담긴 주소값의 묶음을 갖고 있는 주소값을 복제한다.
기본형 특) 불변성임
변수 → 변할 수 있는 데이터, 식별자 → 변수명
JS 메모리 영역
변수 영역과 값 영역으로 나뉨 (책 저자가 이해를 위해 지어낸 것)
변수 영역 ⇒ 변수명과 해당 변수의 데이터 값의 주솟값 저장
값 영역 ⇒ 데이터 저장
영역 분리 이유 ⇒ 메모리 관리 효율적으로 할려고, 데이터 변환할 때 이미 선언되어 있는 주소를 건드리게 될 수 있어서
ex) 'abc' 값을 만들고 나서 'abcdef'를 만들려 하면 'abc'의 주소값 참조를 안 하고, 그냥 'abcdef'를 만든다.
효율적인 이유?
⇒ 숫자 5인 변수가 100개 있다고 할 때, 영역 분리가 안 되어 있으면 숫자 크기 * 100만큼의 메모리 소모가 일어나게 되는데, 영역 분리가 되어있는 경우 숫자 하나 크기 만큼만 메모리 소모가 일어나기 때문에 영역 분리는 효율적임
Object.defineProperty
, Object.freeze
으로 변경 못 하게 할 수 있다. 또한 참조형을 불변값으로 활용하기도 한다.let a = { b: 1}
⇒ a에는 객체의 주솟값, 객체는 b의 주솟값을 갖고 있음.원본 객체의 의미?
원본 객체의 프로퍼티를 수정하지 않고, 새 객체를 만들어 해당 새 객체의 프로퍼티를 변경한다는 의미임. 이로써, 객체끼리의 주솟값도 틀리고 프로퍼티끼리의 주솟값도 틀릴 수 있음
내부 프로퍼티를 변경할 때마다 새 객체를 만들어 재할당하면 됨
var user = {
name: 'Chanhee',
gender: 'male',
};
var changeName = function(user, newName) {
return {
name: newName,
gender: user.gender,
};
};
var user2 = changeName(user, 'Jang');
if(user !== user2) {
console.log('유저 정보가 변경되었습니다.') // 유저 정보가 변경되었습니다.
}
불변 객체가 필요한 상황: 값으로 전달 받은 객체를 수정해도 원본은 바뀌면 안되는 상황일 때.
Shallow Copy(얕은 복사)와 Deep Copy(깊은 복사)를 통해 불변 객체를 만들 수 있다.
간단히 Deep Copy하는 방법
Refer - Core Javascript