[Javascript] Primitive type과 Object type

고성인·2023년 12월 14일

Javascript

목록 보기
2/3

Javascript의 타입

JavaScript는 8개의 타입이 있으며, 이는 크게 primitive type과 object type으로 구분할 수 있다.
primitive type과 object type을 구분하는 기준은 Mutability인데, primitive type은 Immutable하다.

Primitive type

  • Memory의 Stack영역에 실제 값이 저장됨
  • 변수에 할당시 실제 값이 저장됨
  • immutable하며 새로운 값 할당시 새로운 메모리에 값이 할당됨
  • null, undefined, boolean, number, bigint, string, symbol타입이 존재한다

null type

null이라는 하나의 값만 가질 수 있음

undefined type

undefined라는 하나의 값만 가질 수 있음

개념적으로 undefined는 값이 없음을 의미하고 null은 객체가 없음을 의미한다
null의 typeof를 찍어보면 object를 반환하고 undefined의 typeof는 undefined가 나오기 때문에 ===null을 사용하여 null을 테스트하여야함

boolean type

논리 요소를 나타내며 true와 false 두 가지 값을 가짐

number type

-(2^53 - 1) ~ 2^53 - 1의 값을 안전하게 저장할 수있다.
양 끝을 각각 Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER라고 한다
실제 저장할 수 있는 +-(2^-1074 ~ 2^1024)범위를 넘어가는 값은Infinity or 0 으로 자동 변환된다
연산의 결과를 숫자로 표현할 수 없을때는 NaN으로 표현한다

bigint type

number의 안전하게 정수를 저장할 수 있는 Number.MAX_SAFE_INTEGER를 넘는 큰 정수도 안전하게 저장할 수 있다
정수 끝에 n을 추가하거나 BigInt()함수로 생성 가능하다
bigint와 number사이의 연산은 불가능하며, 연산하려면 number type으로 강제 형변환 해주어야한다

string type

텍스트를 나타내며 javascript의 string은 변경할 수 없기 때문에 string을 수정하는 메서드들은 현재 내용을 기반으로 새 String을 만들어준다.

symbol type

고유하고 변경 불가능한 원시값이며 객체의 key로 사능 가능하여 다른 코드의 key와 충돌하지 않도록 보장되는 고유한 key를 만들 때 사용된다

primitive type은 stack에 실제값이 저장된다하지만 실제 상황에서는 다를 수 있다.
예를 들어 number type의 크기가 2^31이상일 경우 constant pool을 통해 실제 값은 heap에 저장되며, string도 실제 값은 heap에 저장된다.

Object type

  • 객체, 함수, 배열 등 js의 대부분의 값은 객체타입이다
  • 변수에 할당시 heap메모리 주소가 저장되며, 실제 값은 heap영역에 존재한다
  • 다른 변수에 할당시 heap메모리 주소가 저장되며, 같은 객체를 공유한다
  • key를 통해 property에 접근할 수 있으며, array의 key는 index이다

Constant pool in v8 engine

a와 b는 각각 따로 Hello world를 할당해주었지만, DebugPrint를 해보면 같은 주소가 반환되어지는 것을 볼 수 있음

그 이유는 string type이 할당될 때 바로 stack에 들어가지는 것이 아니라 constant pool에 Hello, world라는 문자열을 key, 실제로 값이 저장된 heap의 주소를 value로 등록이 되어지고, 다음에 같은 문자열이 다른 변수에 할당되어지면 우선 constant pool에 들어있나 확인하고, 만약 존재한다면 같은 heap의 주소값을 주기 때문임

OldSpace라는 것의 의미는 gc가 돌게되면 우선적으로 없어질 공간이라는 의미

0개의 댓글