ECMAScript 관계 연산자
관계 연산자는 비교 연산을 수행합니다. 각 관계 연산자는 Boolean 값을 반환합니다。
일반 비교 방식
관계 연산자(<=, >=, <, >)는 두 수의 비교 연산을 수행합니다. 비교 방식은 수학 비교 연산과 동일합니다。
각 관계 연산자는 Boolean 값을 반환합니다:
var bResult1 = 2 > 1 // true var bResult2 = 2 < 1 // false
그러나 두 문자열에 관계 연산자를 적용하면 다른 행동을 보입니다. 많은 사람들이 "<"은 "알파벳 순서에서 앞쪽에 위치"라는 것을, ">"은 "알파벳 순서에서 뒤쪽에 위치"라는 것을 생각합니다. 그러나 실제로는 그렇지 않습니다. 문자열에 대해서는, 첫 번째 문자열의 각 문자의 코드가 두 번째 문자열에 해당하는 위치의 문자 코드와数值적으로 비교됩니다. 이 비교 작업이 완료되면 Boolean 값이 반환됩니다. 문제는 대문자 코드가 소문자 코드보다 작기 때문에 다음과 같은 상황이 발생할 수 있습니다.:
var bResult = "Blue" < "alpha"; alert(bResult); // true 출력
위의 예제에서 문자열 "Blue"는 "alpha"보다 작습니다. 문자 B의 문자 코드는 66이고, 문자 a의 문자 코드는 97입니다. 실제 문자 순서로 비교 결과를 강제로 얻기 위해 두 숫자를 같은 대소문자 형식으로 변환한 후 비교해야 합니다.:
var bResult = "Blue".toLowerCase() < "alpha".toLowerCase(); alert(bResult); //출력 false
두 연산자를 모두 소문자로 변환하여 "alpha"가 "Blue"보다 문자 순서에서 앞에 있다는 것을 올바르게 인식할 수 있습니다.
숫자와 문자열을 비교
두 문자열 숫자를 비교할 때 발생하는 또 다른 복잡한 상황은 다음과 같습니다:
var bResult = "25" < "3"; alert(bResult); //출력 "true"
위 코드는 문자열 "25"과 "3"을 비교하고 있습니다. 두 연산자 모두 문자열이므로 문자 코드를 비교합니다. "2"의 문자 코드는 50이고, "3"의 문자 코드는 51입니다.
그러나 연산자 중 하나가 숫자로 변환되면 결과가 흥미롭습니다:
var bResult = "25" < 3; alert(bResult); //출력 "false"
이 경우, 문자열 "25"은 숫자 25로 변환되어 숫자 3과 비교되며, 예상대로 결과가 나타납니다.
숫자와 문자열을 비교할 때마다 ECMAScript는 문자열을 숫자로 변환한 후 숫자 순서로 비교합니다.
그러나 문자열이 숫자로 변환되지 않을 경우 어떻게 될까요? 다음 예제를 고려해 보세요:
var bResult = "a" < 3; alert(bResult);
이 코드가 출력하는 것을 예상할 수 있습니까? 문자 "a"는 의미 있는 숫자로 변환되지 않습니다. 그러나 parseInt() 메서드를 호출하면 NaN을 반환합니다. 규칙에 따르면 NaN을 포함한 모든 관계 연산자는 false를 반환하므로, 이 코드도 false를 출력합니다:
var bResult = "a" >= 3; alert(bResult);
일반적으로, 두 연산자가 작은 연산자의 결과가 false라면, 큰 연산자의 결과는 true여야 합니다. 그러나 NaN이 포함된 경우는 이렇지 않습니다.