typeof
연산자로 알 수 있다.하지만 typeof
반환 값은 항상 7가지 내장 타입과 1:1로 정확히 매치되지 않는다.
typeof undefined === "undefined"; // true
typeof true === "boolean"; // true
typeof 42 === "number"; // true
typeof "42" === "string"; // true
typeof { life: 42 } === "object"; // true
// ES6부터 추가
typeof Symbol() === "symbol"; // true
// 자바스크립트의 20년지기 버그
typeof null === "object"; // true
// "null"을 반환하지 않고 "object"를 반환한다!
// ------ 타입으로 null 값을 정확히 확인하는 방법
var a = null;
(!a && typeof a === "object"); // true
null은 falsy한 유일한 원시 값이지만, 타입은
object
인 특별한 존재이다.
typeof
가 반환하는 또다른 문자열 : function
typeof funciton a(){ /*...*/ } === "function" //true
typeof
반환 값을 보면 function
이 최상위 레벨의 내장 타입처럼 보이지만, 실제로는 object
의 하위타입!function a(b, c) {
/* ... */
}
a.length; // 2
typeof [1, 2, 3] === "object"; // true
typeof
연산자를 대어보는 건
typeof
연산자의 반환 값은 언제난 문자열
typeof 42
는 “number”를 반환typeof typeof 42
는 “string”을 반환undefined
이며, typeof
결과는 “undefined”이다.a; // undefined; b; // ReferenceError; b is not defined
- **`"b is not defined"`과 `"undefined"`는 완전히 다르다!!!!!**
- `typeof` 연산 결과는 더 헷갈림 (typeof만의 독특한 안전가드)
```javascript
var a;
typeof a; // "undefined"
typeof b; // "undefined"
typeof b
를 해도 브라우저는 오류 처리를 하지 않는다.
typeof 안전가드
는 쓸만하다.DEBUG
플래그
var DEBUG = true;
라고 debug.js 파일에만 선언하고, 개발/테스트 단계에서 이 파일을 브라우저가 로딩할때ReferenceError
가 나지 않게 하려면, 조심해서 DEBUG
전역변수를 체크해야 한다.
```javascript
// 이건 에러가 난다!
if (DEBUG) {
console.log(“디버깅을 시작합니다.”)
}// 이렇게 해야 한다. if (typeof DEBUG !== “undefined”) { } console.log(“디버깅을 시작합니다.”)
// 내장 API 기능을 체크할 때 역시 에러가 나지 않게 도와준다. if (typeof atob === “undefined”) { atob = function() { /* … */ }; } ```
typeof
안전가드 없이 전역 변수를 체크하는 다른 방법은 전역 변수가 모두 전역 객체의 프로퍼티라는 점을 이용하는 것
if (window.DEBUG) {
// ...
}
if (window.atob) {
// ...
}
node.js
에서 쓰이는 다중 자바스크립트 환경이라면 문제가 되기에, window
객체를 통한 전역 변수 참조는 가급적 삼가는 것이 좋다.