ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Javascript null, undefined, NaN
    Javascript 2016. 11. 30. 22:21



    다른 언어들을 공부하다가 자바스크립트를 공부하다가 의문에 빠지게 하는 null, undefined, NaN 보통 다른 언어들의 경우 null만을 제공하는데 비슷한듯 비슷하지 않은 세가지의 타입을 제공해 다소 이해가 어려운 부분이 있어 포스팅을 통해 정리하고자 한다.



    - 변수의 타입을 선언하고 값을 할당하지 않은 변수에 접근하면  undefined 를 반환한다.

    - 변수에 null을 할당한 경우, 값자체가 없다는 의미가 아니라 어떠한 유효한 값도 아니라는 뜻으로 선언만 하고 값을 할당하지 않은 경우(undefined)와 다르다.

    - 객체에 선언된 프로퍼티와 선언되지 않은 프로퍼티에 접근하는 경우 모두 undefined를 반환한다.

    - null 과 undefined는 Boolean 문맥에서 모두 false로 반환된다.

    - 숫자문맥에서는 null은 0으로 undefined는 NaN으로 반환된다. 

    NaN 값은 not a number라는 뜻으로 즉 숫자가 아니라는 의미이다.


    null 


    대부분의 프로그래밍 언어는 null 이라는 특별한 값을 지원한다.


    var temp = null;


    이 값(null)의 의미는 '아무런 값도 나타내지 않는다' 라는 의미이며 다음의 구분과 구분된다.


    var temp; 


    즉, null은 어떠한 유효한 값도 아니라는 의미이지 값 자체가 없다는 의미가 아니다. temp 변수는 어떠한 유효한 데이터를 담지 않았을 뿐, null값을 가진다는 의미이다. 따라서 선언만 하고 값을 할당하지 않은 두 번째 예와는 구분된다.



    자바스크립트는 값의 비유효성과 관련한 또 하나의 의미를 제공하는데 바로 undefined이다.

    앞서 두 번째 예가 바로 undefined의 예가 된다. 즉 선언은 되었지만 값이 할당되지 않은 변수에 접근할 경우 undefined 가 된다. 


    var temp;    // undefined


    temp = null;     // null 



    결론적으로 null은 null이라는 값이 할당된 경우이지만, undefined의 경우 선언은 되었지만 아무런 값도 할당되지 않은 경우로 요약할 수 있다. 이 개념은 객체환경에서도 동일하다. 즉 선언은 되었지만 값이 할당되지 않은 객체 프로퍼티 역시 undefined이다. 


    한가지 더 기억해야 할 것은 객체 환경에서는 선언되지 않은 객체 프로퍼티도 undefined 라는 점이다. 일반 변수의 경우 선언되지 않은 경우 오류(Exception)을 내뱉지만 객체 프로퍼티일 경우에는 오류가 아니라 undefined라는 점이다.


    function TempObject(){

        this, i;

    }


    var tempObject = new TempObject();

    tempObject.i;    // 선언은 되었으나 값이 할당되지 않은 객체 프로퍼티: undefined

    tempObject.j;    // 존재하지 않는 객체 프로퍼티 역시 undefined




    문맥에 따른 null, undefined 평가


    자바스크립트는 유연한 자동 형변환이 지원되는 언어이다. null과 undefined 역시 문맥에 따른 자동 형변환이 된다. 



    Boolean 문맥

    null과 undefined 는 실제로 다른 값이지만 참/거짓(Boolean)으로 평가되어야 하는 경우 모두 false로 형변환이 된다.

     

    var temp;


    if (temp)    // undefined가 자동으로 false로 변환됨 

    {

        //...

    }



    숫자 문맥

    숫자 문맥에서는 두 값이 차이를 보이는데 null의 경우 0으로 undefined의 경우 NaN으로 변환된다.


    var temp1 = null;

    var temp2;

    Number(temp1);    // 강제형변환: 0

    Number(temp2);    // 강제형변환: NaN


    temp1 + 2;    // 자동형변환: 2

    temp2 + 2;    // 자동형변환 NaN


    실제로 자바스크립트 모듈을 개발할 경우, 이러한 문맥상 자동형변환의 특징을 이용하는 경우가 많다.






    NaN


    자바스크립트의 NaN 값은 not a number라는 뜻으로 즉 숫자가 아니라는 의미이다. 


    typeof NaN === 'number'    // true


    typeof로는 NaN와 숫자를 구분할 수 없거니와 자신과의 비교도 불허한다.


    NaN === NaN         // false

    NaN !== NaN        // true


    결국, Javascript 에서는 숫자와 NaN을 구분하는 isNaN 함수를 제공하고 있다.


    isNaN(NaN)    // true

    isNaN(0)    // false

    isNaN('oops')    // true

    isNaN('0')    // false


    결국, 숫자를 구별하는 가장 확실한 방법으로 다음과 같은 함수가 쓰일 수 있다.


    function isNumber(value) {

        return typeof value === 'number' && isFinite(value);

    }


    isFinite() 함수는 주어진 숫자가 NaN이 아닌 동시에 양의 무한대나 음의 무한대가 아닌지의 여부를 검사한다. 유한한 숫자인경우 true, NaN이거나 무한수인경우 false를 반환.




    - 변수의 타입을 선언하고 값을 할당하지 않은 변수에 접근하면  undefined 를 반환한다.

    - 변수에 null을 할당한 경우, 값자체가 없다는 의미가 아니라 어떠한 유효한 값도 아니라는 뜻으로 선언만 하고 값을 할당하지 않은 경우(undefined)와 다르다.
    - 객체에 선언된 프로퍼티와 선언되지 않은 프로퍼티에 접근하는 경우 모두 undefined를 반환한다.
    - null 과 undefined는 Boolean 문맥에서 모두 false로 반환된다.
    - 숫자문맥에서는 null은 0으로 undefined는 NaN으로 반환된다. 

    NaN 값은 not a number라는 뜻으로 즉 숫자가 아니라는 의미이다.


    [참고] 



Designed by Tistory.