# 자바스크립트 null?
자바스크립트의 null은
'의도적으로 값이 없음'을 명시하기 위한 기본 데이터 타입이다.
타입도 null이며, 값도 null인 Primitive Type이다.
즉, null은 객체가 아니다!(기본 타입이다!)
# typeof null?
하지만 typeof 연산자로 null의 타입을 체크해보면, object가 뜬다.
var null_01 = null;
typeof null_01; // object
객체인건가 헷갈릴 수 있지만,
이건 자바스크립트 초기 버전의 버그다.
# typeof 연산자의 버그
typeof 구현 코드의 원리는 대충 아래와 같다.
if(is_undefined?){ // undefined 체크
return undefined;
}else if(is_object?){ // object 체크
if(is_function?){ // function 체크
return function;
}else{
return object;
}
}else if(is_number?){ // number 체크
return number
}else if(is_string?){ // string 체크
return string
}else if(is_boolean?){ // boolean 체크
return boolean
}
(이해를 위해 직접 작성한 pseudo code. 실제 코드 전문은 포스팅 하단에 첨부)
typeof 구현 내용에 null을 체크하는 항목이 누락되어 있다.
그래서 'typeof null'의 실행 결과가 'object'가 나오는 것이다.
확실한 버그다!
근데 왜 안 고칠까?
# typeof 수정 제안에 대한 답변
1. 결론 : 'Reject'(거절)
This proposal has been rejected.
2. 이유 :
이미 수많은 사이트들의 코드가 기존의 typeof로 작성되어 있어서, 고치면 위험하다.
이건 '하나의 자바스크립트'라는 정신에 맞지 않는다.
It was implemented in V8 but it turned out that it broke a lot of existing sites.
In the spirit of One JavaScript this is not feasible.
원문 참고 : archive.is/sPyGA#selection-107.1-107.169
들어보니 납득은 되는데,,,
그럼 null 타입 체크는 어떻게 하면 좋을까?
# null 타입 체크 방법?
일치 연산자 (===)을 쓰는게 좋다.
일치 연산자는 값과 타입이 동일할 때에만 true를 반환한다.
var null_02 = null;
null_02 === null; // true
자바스크립트의 null은 객체가 아닌 기본타입 이며,
타입체크는 일치연산자(===)로 하는게 좋다는 걸 기억해두면 좋겠다.
(참고) typeof 연산자 구현코드 전문
JS_PUBLIC_API(JSType)
JS_TypeOfValue(JSContext *cx, jsval v)
{
JSType type = JSTYPE_VOID;
JSObject *obj;
JSObjectOps *ops;
JSClass *clasp;
CHECK_REQUEST(cx);
if (JSVAL_IS_VOID(v)) { // (1)
type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) { // (2)
obj = JSVAL_TO_OBJECT(v);
if (obj &&
(ops = obj->map->ops,
ops == &js_ObjectOps
? (clasp = OBJ_GET_CLASS(cx, obj),
clasp->call || clasp == &js_FunctionClass) // (3,4)
: ops->call != 0)) { // (3)
type = JSTYPE_FUNCTION;
} else {
type = JSTYPE_OBJECT;
}
} else if (JSVAL_IS_NUMBER(v)) {
type = JSTYPE_NUMBER;
} else if (JSVAL_IS_STRING(v)) {
type = JSTYPE_STRING;
} else if (JSVAL_IS_BOOLEAN(v)) {
type = JSTYPE_BOOLEAN;
}
return type;
}
출처 : 2ality.com/2013/10/typeof-null.html
'개발(Development) > JS(자바스크립트)' 카테고리의 다른 글
[JS] 자바스크립트 템플릿 리터럴: 백틱(``), 달러(${ }) 사용법 (0) | 2020.10.10 |
---|---|
[JS] 자바스크립트 래퍼 객체 (기본/원시타입 표준메서드) (2) | 2020.10.10 |
[JS] 자바스크립트 데이터 타입: 기본 타입(원시 타입) (0) | 2020.10.09 |
[JS] 자바스크립트 변수 생성 과정, 호이스팅 정리 (0) | 2020.10.08 |
[JS] VS Code로 HTML, JavaScript 개발 환경 구축/실행(@맥, 윈도우) (3) | 2020.10.03 |
댓글