본문 바로가기
개발(Development)/JS(자바스크립트)

[JS] 자바스크립트 null은 객체? 기본 타입! (typeof null)

by 카레유 2020. 10. 10.

# 자바스크립트 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

 

댓글