Back

JS primitive type

자바스크립트 기본형 데이터의 값이 같다면 서로다른 변수 이름으로 선언한 값들은 같은 주소값을 가르킨다.

이런 글을 읽고 너무 생소한 기분이 들었다.

머릿속이 어디서부터 꼬인 것인지, 잘 모르겠으나 추측을 해보면 참조형이 아니라면 무조건 주소값이 아니라, 해당 값이 메모리에 있을 것이라고 생각했었던 것 같다. 아무튼 아니라고 한다.

let a = 1;
let b = 1;

이 경우 a, b는 같은 call stack의 주소값을 가르키게 된다고 한다.

위의 경우 일어나는 일을 하나씩 적어보자


소스코드 실행 전 선언문(변수, 함수, 객체 등)을 먼저 스캔한다.

let a 선언문을 발견, a 변수를 실행 컨텍스트에 등록

b도 똑같이 간다

스캔 작업이 완료되면 소스코드를 위에서부터 한줄씩 실행한다.

let a 를 만나면 메모리에 공간을 확보하고 undefined를 할당하여 초기화한다.

변수 a에는 해당 메모리의 주소값을 저장한다.

a=1을 만나면

1이라는 값이 number 타입의 64비트 부동소수점 형식임을 파악한다.

number타입의 크기인 8바이트(64비트)의 메모리 공간을 새로 확보,

이후 10을 저장한다. (실제로는 이진수 1010 8비트씩 8개 바이트로 저장)

*기존에 할당된 메모리에 저장되었던 undefined를 1로 변경하지 않는다!

a 변수에 1이 저장된 새로운 메모리의 첫 번째 셀 주소값을 저장한다.

b 역시 a와 같이 undefined를 할당, 변수 b에 해당 메모리의 주소값을 저장한다.

이순간 변수 b에는 undefined 값을 가지고 있는 call stack 주소가 있다면 거기를 가르키게 되며, 없으면 그냥 새로운 메모리를 확보하여 새로운 주소에 undefined 값을 저장하게 될 것 같다.

a에서 이미 잠시 만들어서 사용한 적이 있기 때문에 그렇게 생각한다. 이는 가비지 컬렉터가 더 이상 참조되지 않으면 삭제를 하는데 이 시점은 자바스크립트 엔진 마음대로기 때문에 어떻게 되는지는 알 수 없기 때문에..

b역시 b=1을 만나게 되는데, 1처럼 새롭게 메모리 공간을 확보하는 것이 아닌,

이미 call stack에 a가 가르키는 주소랑 똑같은 즉, 값이 1인 주소가 있기 때문에 거기를 가르키게 되며, 결론적으로 b변수에 a가 새롭게 저장했던 메모리의 첫 번째 셀 주소값을 저장하게 된다.