JavaScript 데이터 타입 (Data Types)

한눈에 보기

JavaScript 데이터 타입은 원시 타입 7가지와 객체 타입으로 나뉜다. 값 복사와 참조 복사의 차이, typeof의 함정, 암묵적 타입 변환과 ===, Truthy와 Falsy까지 핵심을 정리한다.

최종 업데이트 2026.09.17

JavaScript의 데이터 타입은 크게 원시 타입(Primitive Type) 7가지와 객체 타입(Object Type) 하나로 나뉜다. 원시 타입의 값은 변경 불가능(Immutable)하며 변수 간에 값 자체가 복사되는 반면, 객체 타입은 참조(Reference)를 통해 다뤄지기 때문에 복사와 비교의 동작이 근본적으로 다르다. 이 구분을 정확히 이해하는 것이 JavaScript 타입 체계 학습의 출발점이다.

원시 타입 7가지

ECMAScript 표준이 정의하는 원시 타입은 number, string, boolean, undefined, null, symbol, bigint의 7가지다. 원시 값은 한 번 만들어지면 그 자체를 바꿀 수 없다. 예를 들어 문자열의 한 글자를 바꾸는 연산은 존재하지 않으며, 항상 새로운 문자열이 만들어진다.

타입설명예시
number정수와 실수를 모두 표현하는 64비트 부동소수점(IEEE 754)42, 3.14, NaN, Infinity
stringUTF-16 코드 단위의 시퀀스인 불변 문자열"hello"
boolean논리값true, false
undefined값이 할당되지 않은 상태선언만 한 변수
null의도적으로 값이 없음을 나타내는 값null
symbol유일성이 보장되는 값, 주로 객체의 키로 사용Symbol("id")
bigint임의 정밀도의 정수(ES2020)9007199254740993n

number 타입은 부동소수점 방식의 한계 때문에 0.1 + 0.2가 정확히 0.3이 되지 않으며, 안전하게 표현할 수 있는 정수 범위도 Number.MAX_SAFE_INTEGER까지다. 이 범위를 넘는 정수 연산이 필요하면 bigint를 사용한다.

객체 타입과 참조의 의미

원시 타입이 아닌 모든 값은 객체다. 배열, 함수, 정규식, Map, Set도 전부 객체 타입에 속한다. 객체는 변수에 담길 때 값 자체가 아니라 힙(Heap) 메모리에 있는 객체를 가리키는 참조가 저장된다. 따라서 객체를 다른 변수에 할당하면 같은 객체를 두 변수가 함께 가리키게 된다.

const a = { count: 1 };
const b = a;        // 참조가 복사된다
b.count = 99;
console.log(a.count); // 99, 같은 객체를 가리킨다

const x = "hi";
let y = x;          // 값이 복사된다
y = "bye";
console.log(x);     // "hi", 서로 영향이 없다

비교 연산에서도 차이가 드러난다. 원시 값은 내용이 같으면 같다고 판정되지만, 객체는 참조가 같아야만 같다고 판정된다. { } === { } 가 false인 이유가 여기에 있다. 객체를 복사하려면 스프레드 문법이나 structuredClone 같은 수단으로 얕은 복사(Shallow Copy) 또는 깊은 복사(Deep Copy)를 명시적으로 수행해야 한다.

동적 타이핑과 typeof 연산자

JavaScript는 동적 타이핑(Dynamic Typing) 언어다. 변수가 아니라 값이 타입을 가지며, 같은 변수에 다른 타입의 값을 자유롭게 재할당할 수 있다. 값의 타입을 확인할 때는 typeof 연산자를 쓰지만 몇 가지 함정이 있다.

typeof 42;          // "number"
typeof "hi";        // "string"
typeof undefined;   // "undefined"
typeof null;        // "object"  (역사적인 버그, 표준으로 굳어짐)
typeof [];          // "object"  (배열 판별은 Array.isArray 사용)
typeof function(){} // "function"

typeof null이 "object"를 반환하는 것은 초기 구현의 버그가 하위 호환성 때문에 표준으로 남은 사례다. 따라서 null 검사는 value === null처럼 일치 비교로 해야 하고, 배열 판별은 Array.isArray를 사용해야 한다.

타입 변환과 비교 연산

JavaScript는 서로 다른 타입의 값이 만나면 암묵적 타입 변환(Implicit Coercion)을 수행한다. 느슨한 동등 비교인 ==는 비교 전에 피연산자의 타입을 맞추기 때문에 "1" == 1이 true가 되는 등 직관과 어긋나는 결과를 자주 낳는다. 일치 비교인 ===는 타입 변환 없이 타입과 값을 모두 비교하므로 실무에서는 ===를 기본으로 사용하는 것이 안전하다.

조건문에서는 값이 불리언으로 변환된다. false, 0, -0, 0n, 빈 문자열, null, undefined, NaN은 거짓 같은 값(Falsy)이고 그 외의 모든 값은 참 같은 값(Truthy)이다. 빈 배열과 빈 객체가 Truthy라는 점은 실수하기 쉬운 부분이다. null과 undefined만 걸러내고 싶다면 ES2020의 널 병합 연산자(Nullish Coalescing Operator) ??를 쓰면 0이나 빈 문자열을 유효한 값으로 보존할 수 있다.

const port = 0;
console.log(port || 8080); // 8080, 0이 Falsy라서 밀려난다
console.log(port ?? 8080); // 0, null과 undefined만 대체한다

면접에서 이렇게 물어본다

  • 원시 타입과 객체 타입의 차이를 복사와 비교 동작을 중심으로 설명해 보라.
  • typeof null이 "object"를 반환하는 이유와 올바른 null 검사 방법은 무엇인가.
  • 0.1 + 0.2 !== 0.3인 이유를 number 타입의 내부 표현과 연결해 설명해 보라.
  • ==와 ===의 차이는 무엇이고, 실무에서 어느 쪽을 기본으로 써야 하는가.
  • Falsy 값을 모두 나열하고, || 대신 ??를 써야 하는 상황을 예로 들어 보라.
JavaScript / Python 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기