[javascript] 타입

KoEunseo·2023년 6월 16일
1

javascript

목록 보기
23/32

1. 타입 검사

타입 검사를 할 때 보통 사용하는 메서드는 typeof이다.
그런데 typeof에는 한계가 있는데, 원시타입은 검사를 잘 해주는 편이지만 참조타입은 object로 퉁친다. 거기다 자바스크립트는 타입이 동적이기 때문에 제대로 타입 검사하 안되는 문제도 있다. 설상가상으로 자바스크립트 언어 자체적으로 가지고있는 유명한 오류(null의 타입이 object라는)도 있다.

  • typeof: 원시타입 검사 가능.
    function의 타입은 'function'이지만 class의 타입도 'function'이다.
  • instanceof: 생성자로 만들어진 인스턴스인지 여부 판별
object instanceof constructor

arr instance of Array //true
func instance of Function //true
date instance of Date //true

이렇게 보면 제대로 검사하는 것 같아 보이지만,
of 뒤의 타입을 Object로 바꿔줘도 true가 나오게 된다. 프로토타입 체인을 타고 올라가 최상단의 object를 만나 true를 반환하기 때문.
* 프로토타입 체인을 이용한 타입체크
```js
Object.prototype.toString.call(new String('')) //'[object String]'
Object.prototype.toString.call(func) //'[object Function]'
Object.prototype.toString.call(date) //'[object Date]'

2. undefined VS null

undefined, null 둘다 값이 없다는 의미인데, 도대체 차이가 무엇이냐 하는 의문을 항상 갖고 있었다. 최근 코어 자바스크립트라는 책을 읽고 undefined는 자바스크립트가 값이 없을 때 할당하는 값, null은 개발자가 '없음'을 명시적으로 나타내는 값 이라는 결론을 냈었다.
추가적으로 undefined는 수학적으로 NaN, 타입은 undefined
null은 수학적으로 0, 타입은 object 를 리턴한다.

3. eqeq

eqeq가 뭐냐면 ==, 동등연산자를 뜻한다.
맨 처음 코딩을 접했을때 동등연산자는 '='라고 생각했던 시절을 지나 지금은 === 엄격한 동등연산자만 사용을 하고있다.
어떤 고수는 동등연산자를 일부러 사용해서 그마저도 이용을 한다더라, 하는 카더라를 듣기도 했지만 어떤 오류를 발생시킬 지 모르므로 쓰지 않는 것이 팀을 위해 좋겠다.
동등연산자가 위험한 이유는 타입 캐스팅이 발생해 암묵적으로 형변환을 시켜버리기 때문이다. eqeqeq를 쓰자.

4. 형변환 주의

계속 반복적으로 '형변환'에 대해서 이야기를 하고 있다.
typeof라던가 동등연산자를 사용해 '느슨한' 검사를 한다는 것은, 암묵적으로 형변환이 되고있다는 의미다.
런타임시가 아니라면 에러를 잡기 힘들고, 함께 일하는 사람들을 힘들게 할 것이다.
명시적으로 형변환을 사용하자.

5. isNaN

NaN은 동등연산자를 통해 판별할 수 없기 때문에 isNaN 함수가 필요하다.(0을 0으로 나누면 NaN이다.)
isNaN 역시 느슨한 검사를 한다. 그렇기 때문에 많은 문제를 발생시킨다.

// 이것이 허위 양성이고 isNaN이 완전히 신뢰할 수 없는 이유이다.
isNaN("blabla")   // 참: "blabla"는 숫자로 변환됩니다.

Number.isNaN은 엄격한 검사를 하니 Number.isNaN을 사용하도록 하자.

profile
주니어 플러터 개발자의 고군분투기

0개의 댓글