자바스크립트의 데이터 타입은 크게 원시 타입(Primitive Type)과 객체 타입(Object Type)로 구분할 수 있다.
원시 값은 변경 불가능한 값이다. 즉, 변수가 아니라 값이 변경이 불가능하다.
변수는 언제든지 재할당을 통해 변수 값을 변경할 수 있다.
상수는 재할당이 금지된 "변수"이다.
변수의 값을 바꾸고 싶다면 원시 값의 변경이 불가하므로 재할당 해야한다.
1개의 문자는 2바이트, 1개의 숫자는 8바이트를 가진다.
var str = 'Hello';
str = 'World';
라는 코드가 있을 때 식별자 str에는 'Hello'라는 문자열이 저장된 메모리 주소를 가리키다가 'World'라는 문자열을 저장한 메모리 주소를 가리킨다. 즉, 원시 값은 바뀌지 않는다.
문자열은 유사 배열이다.
var str = 'string';
str[0] = 'S'
console.log(str); // string
이 처럼 str의 첫번째 문자에 S를 변경해도 반영되지 않는다.
var score = 80;
var copy = score;
console.log(score); //80
console.log(copy); //80
socre = 100
console.log(score); //100
console.log(copy); //80
이때 var copy = score; 이 코드를 통해 변수 score과 변수 copy 모두 숫자 값 80을 가지게 되었지만 두 변수는 각각 다른 메모리 공간에 저장된 값을 가리킨다. 즉, 이후에 하나의 변수의 값이 바뀌어도 서로 영향을 주지 않는다.
객체는 프로퍼티 갯수가 정해져 있지 않으며 동적으로 추가하거나 삭제할 수 있다. 따라서, 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.
객체는 할당한 변수가 기억하는 메모리 주소를 통해 참조 값에 접근한다.
하지만 객체는 메모리 소비 효율이 안좋고, 원시 값과 다르게 여러 개의 식별자가 하나의 객체를 공유할 수 있다.
객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달되는 것을 참조에 의한 전달이라 한다.
두 개의 식별자가 하나의 객체를 공유한다. 따라서, 원본이나 사본 중 하나라도 객체를 변경하면 서로 영향을 주고 받는다.