typeof라는 키워드는 많이 사용 해보았을 것이다. 많이 사용 해보았다면, typeof null이 object라는 것을 알고 있을 것이다.
NaN의 경우야 Not a number이지만, 숫자가 아니긴 하지만, 숫자로 형변환 중에 나오는 값인 것을 생각하면, 뭐 number라고 나오는 것 까지는 알겠다.
empty의 경우에도, 희소배열이라는 것은 있지만, empty그 자체를 뭘 할 수 있는 것이 아니기 때문에 undefined인 것도 알겠다.
하지만, null이 object란다. 언어를 배우다보면 초반에 데이터타입을 배울 것이다.
보편적 null
c언어를 공부하였다면, 포인터 변수 p를 초기화 할 때, 아래처럼 사용했을 것이다.
int* p = NULL
java를 공부하셨다면, 원시값의 기본값들은, 0, false, ''... 등등 0의 값들을 볼 것이고, 객체의 초기값을 null로 초기화하였을 것이다.
javascript에서 초기화 하지 않은 모든 변수의 초기값은 undefined이다. 데이터 타입이 없기에 0, false, null 그런 것을 당연 못 넣었을 것이라 생각한다.
하지만 현재의 자바스크립트에서는 개체 값의 의도적 부재로 사용하게 되었다.
typeof null
결국 typeof null이 object라는 것은 보편적 null에 대한 결과이다. 즉 객체의 초기값을 말하는 것이니, object라고 생각하자 이다.
이는 0이 number라는 것을 생각하면 맞는 말이다.
하지만, 이 결정은 null은 원시값 이지만, type이 object가 되어버리는 버그를 만들었다.
뭐 물론, 이걸 해결하려고 했던 움직임이 있었다. 하지만 거절되었다.
저 버그를 수정하면, 더 많은 버그가 발생 하기에, 그대로 두었다고 한다.
자바스크립트를 많이 좋아하지만, 이런 부분은 자바스크립트의 한계라고 생각이 된다. 뭐 물론 node처럼 버전을 정할 수 있다면, 문제가 없다. 하지만, 자바스립트의 코드는 브라우저에서 실행될 가능성이 매우 높으며, 브라우저에는 자바스크립트의 버전을 특정 할 수 있는 방법도 없다. 따라서 저런 버그가 있고, 버그임이 인지가 되더라도, 다른 버그를 발생시킬 수 있기에, 가만히 두려는 성향이 보인다.
댓글
댓글 쓰기