ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective JavaScript [5] - 혼합된 데이터형을 == 로 비교하지 마라
    Javascript 2016. 11. 30. 21:56



    본 게시물은 Effective Javascript의 내용을 재구성하여 작성되었음을 알립니다. 저작권 문제 발생시 게시물이 비공개 될 수 있습니다. 



    - == 연산자는 인자들이 서로 다른 데이터형일 때, 일련의 혼동스러운 암묵적인 강제형변환을 적용시킨다.

    - 비교가 어떠한 암묵적인 강제 형변환과도 연관이 없다는 사실을 코드를 읽는 사람에게 명확하게 전달하기 위해서 ===을 사용하라.

    - 비교할 값이 서로 다른 데이터형이라면 프로그램의 동작을 더 명백히 하기 위해 직접 명시적인 강제 형변환을 사용하라.




    다음 표현식의 값이 무엇이라 생각하는가?


    "1.0e0" == { valueOf: function() {return true; } };


    그냥 보기에도 연관이 없어 보이는 이 두 값은 사실 == 연산자에 의해 동등하다고 간주된다. 왜냐하면 암묵적인 강제 형변환에 의해 두 값은 모두 비교되기 전에 숫자로 변환되기 때문이다. 문자열 "1.0e0"는 숫자 1로, 오른쪽의 객체 역시 valueOf 메서드가 호출된 결과인 true가 다시 숫자로 변환되어 1로 처리된다. 


    웹 입력 양식에서 값을 읽어와 숫자와 비교하는 작업에도 이런 강제 형변환을 사용하곤 한다.


    var today = new Date();


    if (form.month.value == (today.getMonth() + 1 ) && 

        form.day.value == today.getDate() ) {

        // ...

    }



    하지만 사실, 값을 숫자로 명시적으로 변환하기는 매우 쉽다. Number 함수나 단일 + 연산자를 사용하면 된다. 


    var today = new Date();


    if ( +form.month.value == (today.getMonth() + 1 ) && 
        +form.day.value == today.getDate() ) {
        // ...

    }


    더 나은 방법으로 엄격한 동일 비교 연산자를 사용할 수 있다.


    var today = new Date();


    if ( +form.month.value === (today.getMonth() + 1 ) && 
        +form.day.value === today.getDate() ) {
        // ...

    }


    두 인자가 동일한 데이터 형이라면 ==와 ===이나 아무런 차이가 없다. 하지만 코드를 읽는 사람에게 형변환이 연관되지 않는다는 점을 확실히 보여주는 더 좋은 방법은 엄격한 동일 비교를 사용하는 것이다. 그렇지 않으면 코드의 동작을 판독하기 위해 정확한 강제 형변환 법칙을 다시 상기시켜 주어야 한다.


    인자 타입 1
    인자 타입 2
    강제 형변환
    null
    undefined
    없음; 항상 true
    null 또는 undefined 
    null 또는 undefined이 아닌 다른 타입
    없음; 항상 false
    원시 데이터형 문자열, 숫자 또는 불리언
    Date 객체
    원시 데이터형 > 숫자
    Date 객체 > 원시 데이터형 (toString 시도 후 valueOf)
    원시 데이터형 문자열, 숫자 또는 불리언
    Date가 아닌 객체
    원시 데이터형 > 숫자
    Date가 아닌 객체 > 원시 데이터형 (valueOf  먼저 시도 후 toString)
    원시 데이터형 문자열, 숫자 또는 불리언
    원시 데이터형 문자열, 숫자 또는 불리언
    원시 데이터형 > 숫자 




    위의 표는 인자가 서로 다른 데이터형일 때 == 연산자의 강제 형변환 법칙을 보여준다. 대부분의 형변환은 숫자 값을 만드는 시도를 한다. 하지만 객체를 다룰 때는 규칙들이 약간 이상해질 수 있다. 연산자는 valueOf 와 toString 메서드를 호출하여 객체를 원시 데이터형 값으로 변환하려 할 것이고, 그 중 처음으로 얻게 되는 원시 데이터 값을 사용할 것이다. Date 객체는 이 두 메서드를 반대 순서로 시도한다.


    == 연산자는 데이터의 다양한 표현에 두루 사용되어 마치 문제 없는 코드처럼 동작하게 한다. 이런 오류 보정은 종종 'do what I mean' 시맨틱(내 듯대로 동작하라) 라고 부른다. 




    요약.

    - == 연산자는 인자들이 서로 다른 데이터형일 때, 일련의 혼동스러운 암묵적인 강제형변환을 적용시킨다.

    - 비교가 어떠한 암묵적인 강제 형변환과도 연관이 없다는 사실을 코드를 읽는 사람에게 명확하게 전달하기 위해서 ===을 사용하라.

    - 비교할 값이 서로 다른 데이터형이라면 프로그램의 동작을 더 명백히 하기 위해 직접 명시적인 강제 형변환을 사용하라.



    끄읕.


Designed by Tistory.