원시 자료형(primitive data types)
스택(stack)이라고 불리는 사물함이 있다
원시 자료형은 사물함에 변수라는 이름표를 달고 할당된 값을 사물함에 넣는다.
string, number, bigint, boolean, undefined, symbol, (null) 과 같은 타입들이 원시자료형에 해당한다.
원시 자료형은 모두 "하나"의 의미를 가진 데이터만을 담고 있다.
변수에는 크기와 관계없이 하나의 데이터만 담을 수 있다.
그렇기 때문에 원시 자료형이 담기는 보관함의 크기는 고정된다.
원시 자료형은 값 자체에 대한 변경이 불가능(immutable)하지만, 변수에 다른 데이터를 할당할 수는 있다.
참조 자료형(reference data type)
JavaScript에서 원시 자료형이 아닌 모든 것은 참조 자료형이다.
배열, 객체, 함수가 참조 자료형에 해당한다.
참조 자료형에는 하나의 데이터가 아닌 여러 데이터가 담기게 된다.
그렇기 때문에 원시 자료형이 보관되는 데이터 보관함이 아닌 특별한 보관함 힙(heap)에 저장된다.
크기가 고정된 스택과 달리 힙은 자기 마음대로 사이즈를 늘렸다가 줄였다 하는 동적(dynamic)보관함이다.
변수(스택)에는 힙에 찾아갈 수 있는 주소가 담겨있고, 그 주소를 따라가서 데이터를 참조하는 방식이다.
이처럼 데이터는 별도로 관리되고, 우리가 직접 다루는 변수에는 주소가 저장되기 때문에 참조 자료형이라고 불린다.
데이터 복사 시 비교
let score = 80;
function duStuff(value) {
value = 100;
}
doStuff(score);
console.log(score) // output: 80
원시 타입 데이터는 데이터 값이 복사되기 때문에 복사된 데이터를 수정해도 원본 데이터에 영향이 가지 않는다.
매개변수 value에 score의 값 80이 전달되는데 원시 자료형은 값 자체를 복사하여 전달하기 때문에 value의 값을 수정해도 score의 초기 할당 값인 80은 유지된다.
let player = {score: 3};
function duStuff(obj) {
obj.score = 2;
}
doStuff(player);
console.log(player.score) // output: 2
참조 타입 데이터는 주소를 복사하기 때문에 복사된 데이터를 수정하면 해당 주소지에 있는 데이터를 수정해서 같은 주소지를 참조하는 원본 데이터에도 영향이 가게 된다.