2014.11.12 23:04

JavaScript 비교 연산에 대한 정리

JavaScript 비교 연산에 대한 정리

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators 에 정리된 글을 참고하였음.


요약 정보

  • 글자에 대한 시퀀스, 길이 및 각 위치에 대해 동일한 문자가 있는 경우 같은 문자열로 본다.
  • 숫자의 값이 동일할 때 두 숫자는 같은 것으로 본다.
    NaN (Not a Number)는 NaN을 포함하여 어떤 것과도 같지 않다.
    양의 0과 음의 0은 서로 같은 것으로 본다. 
  • 두 개의 boolean 대상이 둘 다 true 거나 false인 경우만 서로 같은 것으로 본다
  • 두 개의 구분되는 object는 strict 또는 abstract 비교 시 절대 같지 않아야 한다
  • Object를 비교하는 expression은 서로 참고하는 object가 같은 경우에만 true이다.
  • Null과 Undefined 타입은 strict 비교시는 Null은 Null과 Undefined는 Undefined 만 서로 같을 수 있으나,
    abstract 비교시에는 Null과 Undefined는 서로 같을 수 있다. 

Equality (==)

  • equality operator는 서로의 타입이 다를 경우 타입을 자동으로 변환 후 strict 비교를 한다
  • 대상이 number 또는 boolean 타입 중 하나일 경우 모든 대상을 number 로 변환 후 비교한다. (단, 변환이 가능 할 경우에만)
  • 대상이 string 일 경우라면 숫자형로 변환이 가능할 경우 number로 변환 후 비교한다.
  • 대상이 둘 다 object 라면 각 object가 참고하는 내부 메모리 공간이 동일한지 비교한다.

Identity (===)

  • identity operator는 타입과 상관 없이 strict 비교를 한다.

Comparison Algorithm


Abstract Equality Comparison에서 Type 변경이 발생하는 경우 다음과 같은 규칙을 따른다.

  • number와 string을 비교시, string은 number 값으로 변환된다.
    JavaScript는 string numeric literal을 Number 타입 값으로 변환을 시도하게 된다.
    먼저, 수학적인 값이 string numeric literal 로 부터 얻어지게 되고, Number 값에 가장 가까운 값으로 반올림 또는 버림된다.
  • 만약 대상 중 하나가 Boolean 인 경우, 이 Boolean이 true 몇 1 false면 +0 값으로 변환된다.
  • 만약 object가 number나 string으로 비교되는 경우, JavaScript는 object의 기본 값을 return 하는지 시도하게 된다. object의 valueOf나 toString 메소드를 이용해서 Number 값이나 String과 같은 primitive 값으로 변환을 시도를 한다. 만약, object 변환에 실패하면 runtime error를 생성한다.
  • Object가 primitive 값으로 변환되는 경우는 그 비교 대상이 오직 primitive 타입일 경우에만 변환되며, 대상이 둘 다 object 일 경우는 각각의 object가 같은 memory를 참고하는지에 대한 비교만 하게된다.

Abstract Equality Comparison 예제

  • 1 == ‘1’
    true : number - string 비교이며 string ‘1’이 number 1로 변환 후 비교
  • 1 == true
    true : boolean 비교이므로 true는 1로 변환 후 비교
  • ‘1’ == true
    true : boolean 비교이므로 true는 1로 변환되며 string ‘1’은 number 1로 변환되어 비교
  • ‘2’ == true
    false : boolean 비교이므로 true는 1로 변환되나 string ‘2’는 number 2로 변환되어 비교 
  • new Number(0) && new Boolean(false)
    true : new Number(0)는 number 0에 대한 object이므로 number 0과는 다름.
    Equality 를 비교를 위해서는 다음과 같이 풀어서 사용해야 함
    new Number(0) == true && new Boolean(false) == true
  • ‘ ‘ == 0
    true : number - string 비교이므로 string ‘ ‘이 number 0으로 변환 후 비교
  • NaN == NaN
    false : NaN은 그 어떤 것과 비교해도 false
  • null == undefined
    true : null은 undefined와 비교 시 같은 것으로 취급된다.
  • null == 0
    false : null은 undefined나 null과의 비교에서만 true가 된다.

if 문에서 true 조건

  • if statement condition은 해당 값이 0, false, null, undefined, NaN이 아닌 경우 true로 인식한다.


'Technical Stubs > JavaScript' 카테고리의 다른 글

JavaScript Quiz  (0) 2014.11.12
JavaScript 비교 연산에 대한 정리  (0) 2014.11.12
Trackback 0 Comment 0