JAVASCRIPT

null , array 의 data type 이 object 인 이유

funfunweb 2025. 5. 27. 18:58

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