[javascript] null, undefined, NaN

[1] undefined

undefined는 참 특이하다. typeof 연산자에서 'undefined'로 확인되는 자료형이자, undefined라는 동일한 이름인 하나의 값만을 가질 수 있는 값 자체이기도 하며, 의미상 변하지 않는 고유의 값만을 가졌기에 종종 전역 상수로 분류해 보기도 한다. 

  • undefined의 할당
    • 변수 선언과 동시에 자동으로 설정되어 있는 초기값이다.1
    • 직접 undefined를 값으로 대입하여 사용할 수 있다. 2
    • 객체 내부의 존재하지 않는 프로퍼티에 설정된 값인 것처럼 받기도하며. 3 물론 존재하는 프로퍼티에도 undefined를 값으로 할당할 수도 있다. 4
    • 함수 내부로 넘겨받는 인자에서 값이 설정되지 않은 경우, undefined 값을 갖는다. 
    • 어떤 형식이든 void 키워드가  앞서 사용되면 undefined로 반환한다.5 
  • undefined의 형 변환
    • Number(undefined) => NaN
    • Boolean(undefined) => false
    • String(undefined) => "undefined"
  • null 과의 관계 
    • (null == undefined) 는 참이다.
    • (null === undefined) 는 거짓이다. 6
  • undefined는 유보어가 아니기에 사용자에 의해 변경될 수도 있다. (파이어폭스 제외)
  • undefined는 비록 자료형으로 존재하나 값이 (래퍼) 객체도 아니기에, constructor도 존재하지 않고 constructor 접근시 오류가 발생한다. (== null과 동일)
  • undefined는 자신에 대해 어떠한 프로퍼티를 설정할 수 없다. (== null과 동일)
  • instanceof 연산자에서 모두 거짓을 반환하게 된다. (== null과 동일) 
  • (!undefined)는 true와 같으나 그렇다고 [undefined ==  false]는 참이 아니며 거짓이다. 함수에서 인자의 검사시 undefined가 마치 false와 같아 보여 오해할 수 있다. 
  • 참고로 ((undefined || false) ==  false)는 참이 된다. ㅎ 

[2] null

null은 typeof 연산자에서 "object"의 자료형을 반환하며, null 이라는 하나의 자신 값으로만 존재한다. null은 쉽게 undefined와 비교되어 설명되고 있으나, 차이점이 있다.

  • typeof 연산자에서 문자열 "object"를 반환한다. 
  • null의 형 변환
    • Number(null) => 0 
    • Boolean(null) => false
    • String(null) => "null" 
  • null은 비록 object의 자료형을 반환하나 어떠한 프로퍼티나 메서드를 설정할 수 없다. 
  • null은 constructor가 없으며, instanceof 연산자에서 항상 거짓이다. 7
  • 자바스크립트에서 prompt의 입력된 값이 없는 경우 null을 반환한다. 
  • 정규표현식에 일부(exec 등)는  null을 반환한다.


[3] NaN

NaN은 숫자형의 자료형에서 정해진 하나의 값이다. NaN은 "Not-a-Number"의 약어로 "숫자가 아님"을 의미하나 숫자형 값이다. NaN은 숫자로 표시될 수 없는 것을 강제로 숫자형 자료로 변환시 값이 생성된다.  (예, Number("안녕") -> NaN)

NaN의 큰 특징은 연산의 결과가 NaN이 된다. 모든 산술 연산의 결과는 NaN이다. 만나는 족족 NaN으로 바꾸며 오류를 발생시키지 않아 얼핏 감지 못 할 수도 있다. 그래서 매우 흉칙하면서도 때로는 착하다. 
?
1
2
3
4
5
NaN == NaN; // false
var a = NaN;
var b = a;
a == b; // false 

또한 NaN은 논리연산에서는 항상 거짓이다. NaN은 NaN보다 크지 않으며, 작지도 않으며 심지어 자신과 같지도 않다. 따라서 NaN의 검사는 매우 조심해야하고, 전역 함수로 있는isNaN을 사용하면 된다.

NaN은 자바스크립트 사용에 있어서, CSS의 값을 다룰때 종종 튀어 나온다. 대개 숫자의 값으로 인식하고 연산하려 하지만, 종종 CSS 초기값이나 'auto'와 같이 문자열로 되어 있는 경우가 있기 때문이다. 

 
  • NaN의 형변환
    • String(NaN) => "NaN"
    • Boolean(NaN) => false
    • Number(NaN) => NaN

  1. var a; // a === undefined [본문으로]
  2. var a = undefiend; [본문으로]
  3. a = { }; // a.b === undefined [본문으로]
  4. var a = {b: undefined}; // a.b == undefined [본문으로]
  5. void "메롱"; // undefined [본문으로]
  6. null의 자료형은 object이나, undefined는 자료형이 undefined 이기 때문이다. [본문으로]
  7. undefined가 typeof 연산자가 object로 반환하여, 오해를 가질 수 있지만 "null instanceof Object"은 마찬가지로 false임을 강조한다. [본문으로]

댓글

이 블로그의 인기 게시물

Spring Batch - JobParameters Default Value 만들기

Hsqldb Server 재기동 시 오류