자바스크립트에는 다음 7가지 내장 타입이 있다.
typeof 연산자를 가하면 보통 자기 자신의 타입 명칭과 동일한 문자열을 반환하지만(typeof "42" // "number"
) 몇가지 예외가 있다.
typeof null // "object"
typeof function (a,b) {} // "function"
null은 원시값중 유일하게 falsy 한 값을 가지며 타입은 "object"인 특별한 존재다.
function은 실제로는 obejct의 하위타입이고(호출 가능한 객체이다) 프로퍼티를 가질 수 있다. 함수에 선언된 인자 갯수는 함수 객체의 length 프로퍼티로 알 수 있다.
function hello (a,b) {}
hello.length // 2
var a
typeof a // "undefined"
var b = 42
var c
b=c
typeof b // "undefined"
typeof c // "undefined"
변수가 선언되었지만 값이 할당되지 않은 경우, typeof 연산자는 undefined 를 반환한다.
하지만 변수가 선언조차 되지 않아도(undeclared) typeof 연산자는 undefined 를 반환한다.
값이 할당되지 않은 것과 선언조차 되지 않은 것은 자바스크립트 엔진에서 다르게 취급받는다. undefined 는 다른 변수에 할당할 수 있는 값이지만, 선언조차 되지 않은 것은 ReferenceError 를 띄운다.
var a
a // undefined
b // ReferenceError
var c
a=c // undefined
a=b // ReferenceError
undefined 와 undeclared 를 구분하지 않는 typeof 연산자의 특성을 안전가드 처럼 활용할 수 있다.
어떠한 전역변수가 선언되었는지 체크 하기 위해 다음과 같이 typeof 연산자를 사용할 수 있다.
디버그 모드를 수행하기 위해 DEBUG 라는 전역변수를 체크하는 상황이다.
if (DEBUG) {
console.log("디버그 모드에 돌입합니다.") // 이렇게 체크 하는 경우, DEBUG 변수가 선언되지 않았다면 ReferenceError 가 발생하고 프로그램이 정지한다.
}
if (typeof DEBUG !== "undefined") {
console.log("디버그 모드에 돌입합니다.") // 이 경우에는 DEBUG 변수가 선언되지 않았다 해도 프로그램이 정지하지 않는다. DEBUG 변수가 1. 선언되었고, 2. 할당되었으면 3. 디버그 모드에 돌입한다.
}