인프런 강의 보면서 정리해두기


Data Type

  • 기본형 Primitive Type : Number, String, Boolean, null, undefined, Symbol

  • 참조형 Reference Type : Object(Array, Function, RegExp, Set/WeakSet, Map/WedkMap…)

  • stack memory : 변수, 기본형 데이터, 정적 할당

  • heap memory : 참조형 데이터, 동적 할당


자바스크립트는 변수에 값을 할당 하면 메모리에 값을 바로 할당하는 것이 아니라 메모리의 주소값을 할당한다.

기본형 데이터는 식별자를 이름으로 가진 메모리에 값이 들어간 데이터의 주소를 바로 넣고, 참조형 데이터는 먼저 값을 하나 하나 메모리에 넣고 그것들의 주소값 뭉치를 값으로 가지는 메모리를 만든 후, 뭉치들을 가진 메모리의 주소를 식별자 메모리의 값으로 넣는다.

만약 변수의 값을 수정할 때, 기본형 데이터라면 새로운 값 메모리를 생성 후 해당 메모리의 주소로 주소값을 바꾸며 기존에 쓰던 값이 변하는 것이 아니라 새로운 데이터로 바꿔친다.

따라서 기존에 연결된 다른 변수가 있어도 연결이 끊어지게 된다.

let a = 1;
let b = a;
b = 2; // 이때 a = 1


하지만 변수의 값이 참조형 데이터이고 하위 값을 수정한다면, 해당 식별자를 가진 메모리를 수정하는 것이 아니라 해당 메모리에서 가리키는 데이터를 타고 가서 실제 값의 주소값이 연결되는 데이터만 바꾼다.

기존에 연결된 다른 변수와 여전히 같이 연결되어 있어 하위 값을 수정하면 연결된 변수의 값도 같이 수정된다.

const obj1 = {a: 1, b: 2, c: 3};
const obj2 = obj1;
const obj2.b = 0; // 이때 obj1 = {a: 1, b: 0, c:3}


주소 저장

자바스크립트는 메모리에 값을 저장 시, 값 자체를 직접 식별자와 같이 저장하는 것이 아니고 값은 따로 저장 후 주소값만 식별자에 연결한다.

새로운 변수 선언 후 값을 대입하면 메모리에서 기존에 해당 값이 있는지 찾아보고 있으면 해당 주소 저장, 없으면 새로 만들어서 새 주소를 연결해온다.

이렇게 저장하는 이유는, 값이 많고 길 때 값을 직접 저장하면 데이터 할당시에는 빠르지만 비교 시 비용이 많이 들고 메모리 낭비가 심한 것에 비해, 주소값을 저장하면 데이터 할당시에는 느리지만 (비교해보고 이미 있으면 주소값을 불러와야 해서) 비교시에는 비용이 들지 않고 메모리 낭비를 최소화 할 수 있다.