
값이 들어있는 메모리 상의 주소를 기억하는 저장소이다.
흔히 변수와 식별자를 혼용하는 경우가 많은데, 명확히 말하자면 변수는 데이터를 뜻하고 식별자는 변수명을 뜻한다.
var a; //선언
a = 'abc'; //할당
변수의 선언과 할당을 위한 메모리 영역은 변수명 영역과 데이터 영역으로 구분할 수 있다.
변수를 선언하면 메모리 영역의 빈 공간(변수명 영역)을 하나 확보하고 이름을 a로 지정한다.
그리고 변수에 값을 할당하면 다른 공간(데이터 영역)을 따로 확보하여 값을 저장하고 그 데이터 영역의 주소를 변수명 영역의 값에 저장한다.
변수 영역에 직접 값을 저장하지 않고 한 단계 더 거치는 이유는 데이터 변환을 자유롭게 하고 메모리를 효율적으로 사용하기 위해서이다.
자바스크립트는 동적 타입 언어로, 선언 시 변수의 타입을 지정하지 않고 할당할 때 변수의 타입을 결정한다. 미리 데이터 영역을 확보해뒀다가 나중에 할당받은 데이터가 그 영역보다 크면 메모리를 늘리는 등 번거로운 작업을 거쳐야하기 때문에, 우선 변수명을 저장해놓고 나중에 값을 할당받으면 데이터 공간을 확보하여 저장하는 것이다.
ES6에서 제공하는 데이터타입은 7가지로, 기본형 데이터와 참조형 데이터로 구분된다.
Infinity : 양의 무한대-Infinity : 음의 무한대NaN : 산술 연산 불가" " 나 ' ' 안에 텍스트를 넣어 생성true), 거짓(false)을 나타내는 값을 가진다.null, undefined, 0은 false 값을 가진다.typeof로 연산하면 object 반환 => JS 설계상 오류===) 사용변수와 상수를 구분짓는 성질은 '변경 가능성'이다.
바꿀 수 있으면 변수, 바꿀 수 없으면 상수이다.
그렇다면 상수와 불변값이 같은 개념일까? 답은 '아니오'다.
변수와 상수를 구분짓는 변경 가능성의 대상은 변수 영역 메모리이다. 데이터 할당이 된 변수 영역에 다른 값을 재할당 할 수 있느냐가 관건이다.
반면, 불변성 여부를 구분짓는 변경 가능성의 대상은 데이터 영역 메모리이다.
기본형 데이터는 불변값이다.
숫자든 문자든 한 번 값을 할당하면 다른 값으로 변경할 수 없다. 새로운 데이터 공간에 다른 값을 저장하여 그 주소를 연결하면 되지만 이걸 값을 변경했다고 볼 수는 없다. 이전의 데이터 값의 주소를 참조하지 않을 뿐 여전히 그 값은 존재하기 때문이다.
한 번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 절대 변하지 않는다.
참조형 데이터는 기본형 데이터와 달리 객체의 변수(프로퍼티) 영역이 따로 존재하여 그곳에 프로퍼티를 저장하고, 데이터 영역에 그 주소를 저장한다.
그래서 객체 변수 영역의 값이 다른 주소로 변경되어도 데이터 영역에는 변경사항이 없다. 즉, 데이터 영역에 변화가 없음에도 프로퍼티의 값이 달라질 수 있기 때문에 가변값이라고 보는 것이다.
단, 참조형 데이터가 가변값이라는 건 참조형 데이터 자체를 변경할 경우가 아니라 내부의 프로퍼티를 변경할 때만 성립한다.