1. typeof null → "object"인 이유 (역사적 버그)
배경
- 자바스크립트가 처음 만들어질 때, 값들은 메모리 내에서 특정 비트 패턴으로 저장됩니다.
- null 값은 내부적으로 null 포인터를 의미하는 값으로 저장됐고,
- typeof 연산자는 메모리에서 **값의 타입 태그(type tag)**를 검사하는데,
- 초기 구현에서 null의 타입 태그가 객체(object)로 인식되어 버렸습니다.
그래서…
- typeof null이 "object"로 나오는 것은 자바스크립트 엔진의 오래된 설계 결함입니다.
- 이 문제는 표준이 된 이후로도 수정되지 않았기 때문에 여전히 존재합니다.
- 대부분의 개발자들이 이를 알고 있으므로, null 타입 체크할 때는 별도로 확인합니다.
올바른 null 체크 방법
let value = null;
console.log(typeof value); // "object"
console.log(value === null); // true ← 이렇게 직접 비교해서 확인
2. 배열(Array)도 typeof로 "object"가 나오는 이유
배열은 자바스크립트에서 객체의 특별한 형태
- 배열은 Array라는 내장 객체의 인스턴스입니다.
- 그래서 typeof 연산자는 배열을 포함한 모든 객체 타입에 대해 "object"를 반환합니다.
- 즉, typeof는 배열과 일반 객체를 구분하지 못합니다.
console.log(typeof []); // "object"
console.log(typeof {}); // "object"
3. 배열인지 정확히 확인하려면? — Array.isArray()
ES5부터 도입된 배열 확인 메서드
- Array.isArray() 함수는 값이 배열인지 아닌지 정확하게 판별합니다.
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
console.log(Array.isArray(null)); // false
console.log(Array.isArray("hello")); // false
4. 추가 방법 — Object.prototype.toString.call()
- 좀 더 광범위한 타입 판별이 필요할 때 사용합니다.
console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call({})); // "[object Object]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call("text")); // "[object String]"
5. 정리
표현 결과 설명
typeof null | "object" | 자바스크립트 설계 버그, null은 원래 별도 타입 |
typeof [] | "object" | 배열도 객체로 취급되어 구분 불가 |
Array.isArray([]) | true | 배열 여부를 정확하게 판별 |
Array.isArray({}) | false | 일반 객체 구분 가능 |
Object.prototype.toString.call([]) | "[object Array]" | 모든 타입을 정확히 판별 가능 |
'JAVASCRIPT' 카테고리의 다른 글
자바스크립트의 다양한 데이터 타입 반환 (0) | 2025.05.28 |
---|---|
data type - undefined (0) | 2025.05.28 |
+ 연산자의 역할 (0) | 2025.05.27 |
데이터 타입 확인 방법 (0) | 2025.05.27 |
Falsy 값, truthy 값이란? (0) | 2025.05.27 |