[230220] 일기 : typeof의 맹점

WAYPIL·2023년 2월 20일
0

코드스테이츠-일기

목록 보기
6/10

코드스테이츠 부트캠프 프론트엔드 44기
Section 1 Unit 5 : [Javascript] 기초 1일차


1. typeof

개인적으로 눈에 띄는 JavaScript의 특징들 중 하나, typeof 키워드.

JavaScript의 typeof는 타 언어들의 타입 비교 메서드와 비교해서 꽤 불완전하다. 도대체 어떤 식으로 불완전하다는 것인지 지금부터 한 번 알아보자.

1.1. 객체와 배열을 구분하지 못함

console.log(typeof []);  // object
console.log(typeof {});  // object

특정 값의 자료형이 무엇인지 사용하는 키워드가 바로 typeof이다. 그런데 typeof는 객체와 배열을 구분하지 못하고 모두 object로 인식해버린다.

때문에 객체-배열 구분을 위해서는 또 하나의 로직을 써야 하는데 바로 Array.isArray()이다.

console.log(Array.isArray([]));  // true
console.log(Array.isArray({}));  // false

Array.isArray() 안에 들어간 값이 배열이라면 true, 아니라면 false를 반환한다.


1.2. 왜 typeof null이 object인가?

null이란 '의도적으로 값을 할당하지 않았음'을 명시하기 위한 자료형이다. 당연하겠지만 null은 객체(object)가 아니며, 말 그대로 null의 타입은 null이다.

그런데 왜

console.log(typeof null);  // object

인가 하니, JavaScript 초기 버전 때 버그가 여태까지 안 고쳐진 채 지금까지 이어져오고 있는 거라고 한다. 자세한 정보는 이 블로그 게시물을 참조.

결국 null 타입을 구분하기 위해서는 프로그래머가 수동으로 로직을 짜는 수밖에 없다.


2. 개선 및 활용

typeof와 Array.isArray(), 그리고 null을 구분하는 if문을 활용하면 그나마 완전한 타입 구문 메서드를 만들 수 있다.

function type(param) {
    if (param === null) {
        return "null";
    } else if (Array.isArray(param)) {
        return "array";
    }
    return typeof param;
}

console.log(type(0));  // number
console.log(type(""));  // string
console.log(type(true));  // boolean
console.log(type([]));  // array
console.log(type({}));  // object
console.log(type(null));  // null
console.log(type(undefined));  // undefined

마치 Python의 type()를 연상케 한다.



<오늘의 한마디>

방송통신대 컴과 4학년 1학기 오늘부터 개강!
역대급으로 바쁜 3월~7월이 될 것 같다.

profile
Self-improvement Guarantees Future.

0개의 댓글