STUDY/JavaScript

[ JavaScript ] 비교연산자

 

비교연산자

· 보다 큼/작음 : a > b, a < b

· 보다 크거나/작거나 같음 : a >= b, a <= b

· 같음(동등) : a == b. 등호 =가 두 개 연달아 오는 것에 유의해야함 a = b와 같이 등호가 하나일 때는 할당을 의미한다.

· 같지 않음(부등) : 같지 않음을 나타내는 수학기호 ≠는 자바스크립트에선 a != b로 나타낸다.


 

 

1. 불린형 반환

· 다른 연산자와 마찬가지로 비교 연산자 역시 값을 반환한다. 반환값은 불린형이다.

 1) true가 반환되면 '긍정', '참', '사실'을 의미한다.

2) false가 반환되면 '부정', '거짓', '사실이 아님'을 의미한다.

alert( 2 > 1 );  // true
alert( 2 == 1 );  // false
alert( 2 != 1 );  // true

반환된 불린값은 다른 여타 값처럼 변수에 할당 할 수 있다.

let result = 5 > 4;  // 비교 결과를 변수에 할당
alert( result );  // true

 

 

 

 

2. 문자열 비교

· 자바스크립트는 '사전'순으로 문자열을 비교한다. '사전편집'순 이라고 불리기도 하는 이 기준을 적용하면

  사전 뒤쪽의 문자열은 사전 앞쪽의 문자열보다 크다고 판단된다.

· 실제 단어를 사전에 실을 때 단어를 구성하는 문자 하나하나를 비교하여 등재 순서를 정하는 것과 같이

  자바스크립트도 문자열을 구성하는 문자 하나하나를 비교해가며 문자열을 비교한다.

alert( 'Z' > 'A' );  // true
alert( 'Glow' > 'Glee' )  // true
alert( 'Bee' > 'Be' )  // true

· 문자열 비교 시 적용되는 알고리즘

1) 두 문자열의 첫 글자를 비교한다.

2) 첫 번째 문자열의 첫 글자가 다른 문자열의 첫 글자보다 크면(작으면)

    첫번째 문자열이 두 번째 문자열보다 크다고(작다고) 결론 내고 비교를 종료한다.

3) 두 문자열의 첫 글자가 같으면 두 번째 글자를 같은 방식으로 비교한다.

4) 글자 간 비교가 끝날 때까지 이 과정을 반복한다.

5) 비교가 종료되었고 문자열의 길이도 같다면 두 문자열은 동일하다고 결론 낸다.

     비교가 종료되었지만 두 문자열의 길이가 다르면 길이가 긴 문자열이 더 크다고 결론 낸다.

 

· 예시의 'Z' > 'A' 는 위 알고리즘의 첫번째 단계에서 비교 결과가 도출된다. 반면 문자열 'Glow'와 'Glee'는 복수의 문자로 이루어진 문자열이기 때문에, 아래와 같은 순서로 문자열 비교가 이뤄진다.

1) G는 G와 같다.

2) l은 l과 같다

3) o는 e보다 크기 때문에 여기서 비교가 종료되고, o가 있는 첫번째 문자열 'Glow'가 더 크다는 결론이 도출된다.

 

 

 

 

 

 

 

 

 

 

 

3. 다른 형을 가진 값 간의 비교

· 비교하려는 값의 자료형이 다르면 자바스크립트는 이 값들을 숫자형으로 바꾼다.

alert( '2' > 1 );  // true, 문자열 '2'가 숫자 2로 변환된 후 비교가 진행된다.
alert( '01' == 1 );  // true, 문자열 '01'이 숫자 1로 변환된 후 비교가 진행된다.

불린값의 경우 true는 1, false는 0으로 변환된 후 비교가 이뤄진다.

alert( true == 1 );  // true
alert( flase == 0 );  // true

 

 

 

 

 

 

 

4. 일치 연산자

· 동등 연산자 ==은 0과 false를 구별하지 못한다.

alert( 0 == false );  // true

피연산자가 빈 문자열일 때도 같은 문제가 발생한다.

alert( '' == flase );  // true

이런 문제는 동등 연산자 ==가 형이 다른 피연산자를 비교할 때 피연산자를 숫자형으로 바꾸기 때문에 발생한다.

빈 문자열과 false는 숫자형으로 변환하면 0이 된다.

 

* 그렇다면 0과 false는 어떻게 구별할 수 있을까?

- 일치 연산자 ===를 사용하면 형 변환없이 값을 비교할 수 있다.

- 일치 연산자는 엄격한 동등 연산자이다. 자료혀으이 동등 여부까지 검사하기 때문에

   피연산자 a와 b의 형이 다를 경우 a === b는 즉시 false를 반환한다.

alert( 0 === false );  // flase, 피연산자의 형이 다르기 때문이다.

일치 연산자 ===가 동등 연산자 ==의 엄격한 버전인 것처럼 '불일치' 연산자 !==는 부등 연산자 !=의 엄격한 버전이다.

일치 연산자는 동등 연산자보다 한 글자 더 길긴 하지만 비교 결과가 명확하기 때문에 에러가 발생할 확률을 줄여준다.

 

 

 

 

 

 

 

 

 

 

5. null이나 undefined와 비교하기

 

1) 일치 연산자 ===를 사용하여 null과 undefined를 비교

· 두 값의 자료형이 다르기 때문에 일치 비교 시 flase가 반환된다.

alert( null === undefined );  // false

 

2) 동등 연산자 ==를 사용하여 null과 undefined를 비교

· 동등 연산자를 사용해 null과 undefined를 비교하면 특별한 규칙이 적용돼 true가 반환된다.

· 동등 연산자는 null과 undefined를 '각별한 커플'처럼 취급한다. 두 값은 자기들끼리는 잘 어울리지만 다른 값들과는 잘 어울리지 못한다.

alert( null == undefined );  // true

 

3) 산술 연산자나 기타 비교 연산자 <, >, <=, >= 를 사용하여 null과 undefined를 비교

· null과 undefined는 숫자형으로 변환된다. null은 0, undefined는 NaN으로 변환된다.

 

 

4) null vs 0

· null과 0을 비교

alert( null > 0 );  // (1) false
alert( null == 0 );  // (2) false
alert( null >= 0 );  // (3) true

위 비교 결과는 논리에 맞지 않아 보인다. (3)에서 nulldms 0보다 크거나 같다고 했기 때문에 (1)이나 (2)중 하나는 참이어야 하는데 둘 다 거짓을 반환한다.

이런 결과가 나타나는 이유는 동등 연산자 ==와 기타 비교 연산자 <, >, <=, >=의 동작 방식이 다르기 때문이다.

(1)에서 null > 0 이 거짓을, (3)에서 null >= 0 이 참을 반환하는 이유는 기타 비교 연산자의 동작 원리에 따라 null이 숫자형으로 변한돼 0이 되기 때문이다.

그런데 동등 연산자 ==는 피연산자가 undefined나 null일 때 형 변환을 하지 않는다.

undefined와 null을 비교하는 경우에만 true를 반환하고 그 이외의 경우(null이나 undefined를 다른 값과 비교할 때)는 무조건 false를 반환한다. 이런 이유 때문에 (2)는 거짓을 반환한다.

 

5) 비교가 불가능한 undefined

· undefined를 다른 값과 비교하면 안된다.

alert( undefined > 0 );  // false (1)
alert( undefined < 0 );  // false (2)
alert( undefined == 0 );  // false (3)

위 예시를 보면 undefined는 0과의 비교에서 항상 false를 반환한다.

이런 결과는 아래와 같은 이유 때문에 발생한다.

· (1)과 (2)에선 undefined가 NaN으로 변환되는데(숫자형으로의 변환), NaN이 피연산자인 경우 비교 연산자는 항상 false를 반환한다.

· undefined는 null이나 undefined와 같고 그 이외의 값과는 같지 않기 때문에 (3)은 false를 반환한다.