데이터 타입 (Data Type)
자바스크립트는 느슨한 타입(loosely typed)의 동적 언어이다.
변수는 어떤 특정 타입과 연결되지 않으며, 모든 타입의 값으로 할당 및 재할당이 가능하다.
let foo = 29; // number
foo = 'bar'; // string
foo = true; // boolean데이터 타입은 원시 타입(Primitive Types)과 객체 타입(Object Type), 두 가지로 나뉘며 이 분류는 ECMAScript 사양에 명시된 정의를 따른다.
ECMAScript 2023 기준 4.Overview -> 4.4 Terms and Definitions 에서 Number에 대해 5가지가 정의되어 있다.
원시 타입 (Primitive Types)
원시 타입은 단 하나의 값만을 담을 수 있으며, 불변(immutable)한 특징을 가진다.
값을 변경하는 것이 아니라, 새로운 값이 생성되고 식별자는 그 새로운 값으로 다시 바인딩된다.
원시 타입 종류
ECMAScript 2023 기준 총 7개의 원시 타입이 있다.
| 타입 | 설명 | 예시 |
|---|---|---|
string | 텍스트 데이터를 나타내는 문자열 | "안녕하세요", 'JavaScript' |
number | 정수와 실수를 모두 포함하는 숫자 | 100, 3.14, Infinity, NaN |
boolean | 참(true) 또는 거짓(false)의 논리 값 | true, false |
undefined | 값이 할당되지 않은 변수의 기본 값 | let a; // a는 undefined |
null | '값이 없음'을 의도적으로 명시하는 값 | let a = null; |
symbol | 유일하고 변경 불가능한 식별자를 만들 때 사용 | Symbol('id') |
bigInt | number 타입이 표현할 수 있는 한계를 넘는 매우 큰 정수를 다룰 때 사용 | 12345678901234567890n |
코드로 이해하기

- 메모리에 Number Type의 100이란 값이 생성되고, 식별자 a는 메모리에 생성된 100의 메모리 주소를 가리킨다.
// a는 값 100에 바인딩됨
let a = 100;- 이전에 메모리에 생성된 100이란 값이 50으로 수정되는 것이 아니라 새로운 Number Type의 50이라는 값이 새롭게 메모리에 생성되고, a가 그 주소값을 가리킨다.
// a는 값 100에 바인딩됨
let a = 100;
// 값 100은 변경되지 않고, 새로운 값 50이 생성되며 a는 50으로 재바인딩됨
a = 50;객체 타입 (Object Type)
객체 타입은 여러 개의 값을 하나의 단위로 묶은 복잡적인 자료구조이며, 가변(mutable)한 특징을 가진다.
값을 변경하면 새로운 값이 생성되는 원시 타입과 달리, 객체는 할당된 메모리 공간 안에서 직접 속성을 변경, 추가, 삭제할 수 있다.
객체 타입의 특징
- 복합적인 데이터 구조: 여러 개의 값을 하나의 단위로 묶어서 관리할 수 있다.
- 참조에 의한 전달 (Pass-by-reference): 변수에 객체를 할당하면, 값 자체가 복사되는 원시 타입과 달리 해당 객체를 가리키는 메모리 주소(참조)가 저장된다. 이 때문에 여러 변수가 하나의 객체를 공유하고 수정할 수 있다.
- 동적 속성 추가/삭제: 객체가 생성된 이후에도 자유롭게 속성을 추가하거나 삭제할 수 있다.
객체 타입 종류
| 종류 | 설명 | 리터럴(생성) 예시 | typeof 결과 |
|---|---|---|---|
| 일반 객체 (Ordinary Object) | 키(key)와 값(value)의 쌍으로 이루어진 속성들의 집합. 가장 기본적인 객체. | const obj = { a: 1 }; | "object" |
| 배열 (Array) | 순서가 있는 값들의 목록. length 속성과 배열 전용 메서드를 가짐. | const arr = [1, 2, 3]; | "object" |
| 함수 (Function) | 호출할 수 있는 코드를 값으로 가지는 특별한 객체. | function func() {} | "function" |
| 내장 객체 (Built-in Object) | 특정 목적을 위해 자바스크립트가 기본적으로 제공하는 객체들. | const date = new Date();const re = /ab+c/; | "object" |
| 래퍼 객체 (Wrapper Object) | 원시 값을 감싸서 객체처럼 다룰 수 있게 해주는 객체. | const str = new String('abc');const num = new Number(123); | "object" |
| Map / Set | (ES6+) 키-값 쌍과 값의 집합을 다루는 데 특화된 객체. | const map = new Map();const set = new Set(); | "object" |
코드로 이해하기
객체 타입은 변수에 값이 저장된 위치 정보(주소/참조)가 저장된다.
let myArray = []; // 빈 배열 (객체 타입)
빈 배열 []이라는 실제 데이터는 별도의 메모리 공간 힙(Heap)에 생성된다. (이미지에서 주소 22VVCX011에 해당)
다른 변수 할당
let myArray = []; // 빈 배열 (객체 타입)
let newArray = myArray; // myArray의 '주소 값'이 복사 됨
newArray.push(1);
console.log(myArray); // [1]
console.log(newArray); // [1]실제 내용 []을 복사한 것이 아니라, 배열이 저장된 주소를 복사한 것이다.
즉, 이름만 다를 뿐, 동일한 주소에 있는 똑같은 배열 하나를 가리키고 있는 것 뿐이다.
객체 타입은 변수끼리 주소(참조)를 공유하므로, 하나의 변수를 통해 객체를 변경하면 다른 변수에도 영향을 준다.