원시 타입은 7종류가 있습니다.
원시 타입은 변수에 할당될 때 메모리에 고정 크기로 원시 값(불변성 : immutable)을 저장하고 그 값을 변수가 직접 가리키는 형식입니다. 다시 말하면 데이터를 저장하기 위한 별도의 데이터 공간을 확보해 값을 저장하고, 그 공간을 변수 영역에 저장합니다. ( 변수 영역과 데이터 영역이 존재 )
// 예시임
let str = "문자열" // 주소값 100번지에 "문자열" 값이 저장되고 str 변수가 주소값을 가리킴
str = "새문자열" // 주소값 200번지에 "새문자열" 값이 저장되고 str 변수가 주소값을 가리킴
// 주소값 100번지에는 "문자열" 값이 그대로 존재.
변수에 값을 재할당할 때 기존 값이 변하는 것처럼 보이지만 사실은 새로운 메모리에 재할당한 값이 저장되고 변수가 가리키는 메모리가 달라지는 것이다.
// 예시임
let str = "Hello";
let string = str;
str = "world!";
console.log(str); // world!
console.log(string); // Hello
원본 변수에 값을 재할당해도 복사본의 값은 변하지 않는다. 새로운 변수 string이 str의 주소값을 가리키기 때문이다.
원시타입을 제외한 나머지 배열, 객체, 함수가 참조타입 입니다. 얘네는 별도의 메모리 공간(Heap)에 저장되며 변수의 크기가 동적으로 변할 수 있다. 변수에 할당 시 데이터에 대한 주소 ( 힙(Heap) 메모리의 주소값)가 저장되기 때문에 자바스크립트 엔진이 변수가 가지고 있는 메모리 주소를 이용해서 변수의 값에 접근하게 되는것이다.
let arr = [1, 2, 3];
let newArr = arr;
arr.push(5);
console.log(newArr); // [1, 2, 3, 5]
위 예제에서 newArr에는 arr의 주소값이 들어간다. 그러므로 arr의 값이 변하면 newArr는 같은 곳을 바라보고 있기 때문에 arr의 값과 똑같이 나온다.