💜 자바스크립트의 모든 데이터 타입은 참조형 데이터
=> 어떤 데이터 타입이든 변수에 할당하기 위해서는 주솟값을 복사해야하기 때문
💛 C/C++, 자바 등의 정적 타입 언어는 메모리의 낭비를 최소화하기 위해 데이터 타입별로 할당할 메모리 영역을 2byte, 4byte 등으로 나누어 정해놓음.
💛 but, 메모리 용량이 과거보다 월등히 커진 상황에서 등장한 자바스크립트는 상대적으로 메모리 공간을 좀 더 넉넉하게 할당
=> 숫자의 경우 정수형인지 부동소수형인지 구분하지 않고 8byte를 확보
let a; // 변수 선언 - 1), 2)
a = 'abc'; // 데이터 할당 - 3), 4)
/*
1) 명령을 받은 컴퓨터는 메모리에서 비어잇는 공간 하나를 확보(주소값 설정)
2) 이 공간의 이름(식별자)를 'a'로 지정
3) 데이터를 저장하기 위한 별도의 메모리 공간을 확보한 후 문자열 'abc'를 저장
4) 데이터를 저장한 주소(3)를 변수 선언한 영역(1)에 저장
*/
🧡 변수와 데이터 영역을 분리하면 중복된 데이터에 대한 처리 효율이 높아짐
🧡 기존 문자열에 어떤 변환을 가하든 상관 없이 무조건 새로 만들어 별도의 공간에 저장
=> 기존 데이터는 자신의 주소를 저장하는 변수가 하나도 없게 되면 가비지 컬렉터의 수거 대상이 됨
🧡 참조 카운트: 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수
=> 참조 카운트가 0인 메모리 주소는 가비지 컬렉터의 수거 대상
객체의 변수 복사
객체의 프로퍼티 변경
let obj1 = { a: 1, b: 'aaa' };
let obj2 = obj1;
obj2.a = 20;
/* 결과
obj1 = { a: 20, b: 'aaa' }
obj2 = { a: 20, b: 'aaa' }
=> obj1 === obj2
*/
객체 자체 변경
let obj1 = { a: 1, b: 'aaa' };
let obj2 = obj1;
obj2 = { a: 20, b: 'aaa' };
/* 결과
obj1 = { a: 1, b: 'aaa' };
obj2 = { a: 20, b: 'aaa'}
=> obj1 !== obj2
*/
불변 객체 만들기
let copyObject = function(target) {
let result = {};
for (let prop in target) {
result[prop] = target[prop];
}
return result;
};
// 방법1)
let copyObjectDeep = function(target) {
let result = {};
if (typeof target === 'object' && target !== null) {
for (let prop in target) {
result[prop] = copyObjectDeep(target[prop]);
} else {
result = target;
}
return result;
};
// 방법2)
let copyObjectViaJSON = function(target) {
return JSON.parse(JSON.stringify(target));
};
💚 undefined와 null의 혼란을 피하기 위해 undefined는 직접 할당하지 않고 자바스크립트 엔진이 반환하는 경우에만 해당하도록 하고, '비어있음'을 명시적으로 나타내고 싶을 때는 null을 쓰도록 하는 것이 좋음