

js에서 undefined 는 undefined 로 타입이 판정나는 반면, null의 타입은 object 로 판명이 난다. 왜 이러한 결과가 발생하는 것일까?
이는 초기 js에서부터 시작된 오래된 버그이다. 이 버그는 나중에 호환성을 유지하기 위해 수정되지 않고 그대로 남아있기 때문에 지금도 typeof null은 object 타입을 반환한다. 이러한 버그가 생기게된 배경을 살펴보자.
js가 처음 만들어졌을 때, 값들이 내부적으로 어떻게 표현되는지에 대한 설계가 있었다. 당시에는 값들이 타입 태그와 실제 데이터로 나뉘어 표현되었다. 예를 들면 아래와 같다.
이 때문에 typeof null을 검사하면, null이 객체처럼 보이는 결과가 나왔다. 초기에는 이 설계 실수를 바로잡지 못했고, js는 빠르게 인기를 얻어 많은 코드베이스에서 사용되었다.
또한 js가 널리 사용되면서, 기존 코드와의 호환성을 유지하는 것이 중요해졌다. 만약 typeof null이 다른 값을 반환하도록 변경한다면, 많은 기존 코드들이 깨지거나 예상치 못한 동작을 하게 될 수 있다. 그래서 이 설계 실수는 그대로 남아 있게 되었다.
아래는 js에서 여러 형태의 값을 typeof 를 통해 검사한 결과이다.
console.log(typeof null); // "object"
console.log(typeof undefined); // "undefined"
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
console.log(typeof 42); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
배열의 타입이 object 인 이유는, js에서의 배열은 객체의 특수한 형태로 구현이 되었기 때문이다.
null은 실제로 object 형식이 아니며, 객체도 아니다. null은 “아무 객체도 가리키지 않음”을 의미하는 특별한 값이다.typeof null이 object를 반환하는 것은 설계상의 실수이며, 이는 앞으로도 변경되지 않을 가능성이 크다.