변수
와 상수
를 구분하는 기준은 변경 가능성
이다. 즉, 식별자에 할당되어있는 값의 메모리 주소가 변하지 않는다
는 것이다.
불변값과 상수는 다르다.
변수, 상수는 변수의 영역이며,
불변성 여부는 데이터의 영역이다.
원시값
은 불변값이다.
const a = 1; //1
const b = 1; //1
const c = b + 1; //2
a 식별자의 메모리 주소에 1이 담겨있는 메모리 주소를 할당한다.
이후, b 식별자의 메모리 주소에 새로운 1을 생성해서 할당하는 것이 아닌, a에 할당해준 것과 동일한 메모리 주소를 할당한다.
즉, 불변값은 이미 만들어놓은 값이 있다면 그것을 동일하게 참조하며,
해당 불변값이 없다면 불변값을 새로 만들어낸다.
데이터는 원시값과 참조값이 있으니, 참조값이 가변값인 것을 추론할 수 있다.
다만, 참조값을 불변값으로 쓰는 경우(Object.freeze)도 있다.
식별자의 메모리 공간에 object의 메모리 주소를 할당한다.
해당 메모리 주소로 가보면 값에는 프로퍼티들의 주소가 참조되어있다.
해당 주소로 가면 해당 프로퍼티의 key와 value값. 즉, 불변값들이 들어있다.
메모리 데이터 : 변수의 이름
& 변수 값이 저장되어있는 영역의 메모리 주소
가 저장되어있는 영역.
메모리 데이터 : 불변값
또는 프로퍼티의 변수영역(객체)
이 저장되어있는 영역.
참조 데이터와 식별자들의 참조 대상.
객체의 변수 영역에서 제공하는 주소에 할당된 데이터 영역의 주소로 가보자.
해당 데이터 영역은 불변값이 아닌, 각 프로퍼티들의 변수영역에 대한 메모리 주소를 가지고 있다.
해당 주소로 간다면 또 다시 변수영역. 즉, 변수 이름과 데이터 영역의 메모리 주소를 가진다.
메모리 주소 : 1001
데이터(변수 영역) : {이름 : a, 값 : @5001}
메모리 주소 : 1002
데이터(변수 영역) : {이름 : b, 값 : @5001}
메모리 주소 : 5001
데이터(데이터 영역) : {값 : 1}
변수 참조 후, 값을 변경하면 1002번의 변수영역의 값(@5001)이 다른 주소로 변경된다.![]
정말 유익하네요