typeof 연산자는 피연산자의 타입을 나타내는 문자열을 반환합니다.
애석한 일이지만, 이 연산자는 자바스크립트의 일곱 가지 데이터 타입(undefined, null, 불리언, 숫자, 문자열, 심볼, 객체)을 정확히 나타내지 못하며 끝없는 혼란을 초래했고 계속 비판을 받았습니다.
typeof 연산자는 typeof null을 “object”라고 판단하는데, 이런 행동은 버그라고 해도 할 말이 없습니다.
null은 당연히 객체가 아니라 원시 값입니다.
typeof null이 “object”를 반환하는 이유가 있긴 하지만, 너무 오래됐고 여기서 설명할 만큼 흥미로운 이유도 아닙니다.
이 현상을 수정해야 한다는 주장은 아주 많았지만, 이미 typeof null이 “object”를 반환한다는 사실을 이용하는 코드가 너무 많이 생겨서 이제는 돌이킬 수 없게 됐고, 명세에 수록됐으므로 바꿀 수도 없습니다.
typeof는 배열과 배열 아닌 객체도 정확히 구분하지 못합니다.
함수(객체의 특별한 타입)는 정확히 식별하지만, typeof []는 “object”를 반환합니다.
[표 5-8]은 typeof가 반환할 수 있는 값입니다.
표 5-8 typeof의 반환값
표현식 | 반환값 | 참고 |
---|---|---|
typeof undefined | “undefined” | |
typeof null | “object” | 애석하지만 사실입니다. |
typeof {} | “object” | |
typeof true | “boolean” | |
typeof 1 | “number” | |
typeof “” | “string” | |
typeof Symbol() | “symbol” | ES6에서 새로 생겼습니다. |
typeof function() {} | “function” |
NOTE_
typeof는 연산자이므로 괄호는 필요 없습니다.
즉 변수 x의 타입을 알아볼 때는 typeof(x) 가 아니라 typeof x를 사용합니다.
typeof(x)도 문법적으로는 유효합니다.
다만 괄호 때문에 불필요한 표현식이 끼어들 뿐입니다.