본 절에서는 자바스크립트의 동등(equality) 연산자와 부등(inequality) 연산자를 다룬다.
이들 연산자는 두 값을 비교하여 그들이 같은지 다른지 판단한 후 비교 결과에 따라 불리언(true 또는 false)을 반환한다. 6장에서 보겠지만 프로그램 실행의 흐름을 제어하기 위한 if 문 및 or 루프에서
이 연산자들이 매우 널리 사용된다.
1. 동등(==)과 일치(===)
== 연산자와 === 연산자 모두 주어진 두 값이 같은지 확인하는데 쓰이지만, '같다'는 것을 정의하는 기준이
서로 다르다. 두 연산자 모두 피연산자의 타입을 가리지 않으며 주어진 피연산자들이 같으면 true를, 다르면 false를 반환한다는 점에서 공통적이다. === 연산자는 일치 연산자로 알려져 있는데, '같다'는 기준을 매우
엄격하게 정의하여 두 피연산자가 '일치(identical)' 하는지 확인한다.
== 연산자는 동등 연산자로 알려져 있으며, '같다'는 것을 말할 때 타입 변환도 허용하는 좀 더 느슨한 정의에 입각하여 두 피연산자가 '동등(equal)'한지 확인한다.
===일치 연산자는 ECMAScript v3에서 표준화되었으며 자바스크립트 1.3과 이후 버전에서 구현되었다.
일치 연산자가 소개되면서 자바스크립트는 =, ==, === 연산자를 지원하게 되었다.
여러분은 할당, 동등, 일치 연산자의 차이를 확실하게 이해하여야만 하며, 코딩할 때 올바른 것을 사용하도록 주의해야 한다! 이 세 가지 모두 '같다'로 부르기 십상인데, 다음과 같이 해보면 혼동을 좀 줄일 수 있을 것이다. = 는 '취하다(gets) 또는 할당하다(assigned)', ==는 '~와 동등하다(is equal to)', ===는 '~와 일치한다(is identical to)'라고 읽는 것이다.
자바스크립트에서 숫자, 문자열, 불리언 값들은 '값에 의해' 비교된다 .이 경우 서로 별개인 두 값에 대해 == 연산자와 === 연산자는 이 두값이 일치하는지 확인한다. 이 말은 즉, 오직 두 변수가 똑같은 값을 가질 때에만 이 두 변수는 동등하다 내지는 일치한다고 말하는 것이다. 예를 들어 문자열의 경우 오직 두 문자열을 이루는 문자들이 정확히 똑같을 때에만 두 문자열은 동등하다고 말한다.
반면 객체, 배열, 함수는 '참조에 의해' 비교된다. 이 말은 즉, 두 변수가 같은 객체를 참조할 때에만 이 두 변수는 동등하다고 말하는 것이다. 설사 두 배열의 원소들이 동등하거나 일치한다 하더라도 서로 별개인 두 배열은 절대로 동등하거나 일치할 수 없다. 서로 별개인 두 객체가 같은 프로퍼티를 가지는지, 또는 서로 별개인 두 배열이 같은 원소를 가지는지 테스트해보려면 해당 프로퍼티나 원소들의 동등함이나 일치함을 일일이 개별적으로 확인해야만 한다. (그러나 이러한 원소나 프로퍼티 중에 하나라도 그 자체로 객체나 배열인 것이 있다면, 비교 작업이 몇 단계나 깊이 들어갈 것인지 결정해야만 할 것이다.)
=== 연산자가 두 값이 일치하는지 아닌지 판단하는 데에는 다음 규칙들을 따른다.
- 두 값의 타입이 다르다면 두 값은 일치하지 않는다.
- 두 값이 모두 숫자이고 값이 같다면 두 값은 일치한다. 단, 적어도 하나의 값이 NaN일 경우 두 값은 일치하지 않는다. NaN 값은 어느 값과도 일치하지 않는다. (심지어 NaN 자체와도 일치하지 않는다!) 어떤 값이 NaN인지 확인하려면 전역 함수인 isNaN()을 사용하라.
- 두 값이 모두 문자열이고 같은 위치에 정확히 같은 문자들을 갖고 있다면 두 값은 일치한다. 만일 문자열의 길이나 내용이 다를 경우 두 값은 일치하지 않는다. 몇몇 경우 Unicode 표준에서 한 문자열을 인코딩 하는 방법이 두 가지 이상일 수 있음을 유의하라. 하지만 자바스크립트에서는 효율성을 위해 엄격히 문자 대 문자 비교의 원칙으로 문자열을 비교하며, 모든 문자열은 비교되기 이전에 '정규 형식(normalized form)'으로 변환되어 있다고 가정한다. 문자열을 비교하는 다른 방법은 3부에 있는 String.localCompare()의 레퍼런스를 보라.
- 두 값이 모두 불리언 값 true인 경우, 또는 두 값이 모두 불리언 값 false인 경우, 두 값은 일치한다.
- 두 값이 같은 객체, 배열 또는 함수를 참조할 경우 두 값은 일치한다. 만일 두 값이 서로 별개의 객체(또는 배열이나 함수)를 참조할 경우 두 값은 일치하지 않는다. 설사 두 객체의 프로퍼티가 일치하거나 두 배열의 원소가 일치한다 하더라도 마찬가지다.
- 두 값이 모두 null일 경우, 또는 두 값이 모두 undefined일 경우, 두 값은 일치한다.
== 연산자가 두 값이 동등한지 아닌지 판한다는 데에는 다음의 규칙들을 따른다.
- 두 값의 타입이 같은 경우 두 값이 일치하는지 테스트한다. 두 값이 일치할 경우 그 둘은 동등하다. 두 값이 일치하지 않는 경우 동등하지 않다.
- 두 값의 타입이 다른 경우라 할지라도 동등할 여지가 있다. 동등합을 확인하는 과정에서 다음 규칙와 타입변환이 사용된다.
- 두 값중 하나가 null이고 다른 하나가 undefined라면 두 값은 동등하다.
- 한 값이 숫자이고 다른 하나는 문자열이면, 문자열을 숫자로 변환한 후 이를 사용해 다시 비교한다.
- 두 값 중 하나가 true이면, 이를 1로 변환한 후 다시 비교한다. 두 값 중 하나가 false이면, 이를 0으로 변환한 후 다시 비교한다.
- 한 값이 객체이고 다른 하나는 숫자 또는 문자열이면, 객체를 기본 타입의 값으로 변환한 후 다시 비교한다. 객체를 기본값으로 변환하는 데에는 해당 객체의 toString()메서드나 valueOf() 메서드가 사용된다. 코어 자바스크립트 내장 클래스에서는 toString() 변환을 적용하기 전에 먼저 valueOf() 변환을 시도한다. 단, Date 클래스는 예외적으로 toString() 변환을 바로 수행한다. 코어 자바스크립트에 속하지 않은 객체에서는 각 구현에서 정의한 방식으로 기본값 변환을 수행한다.
- 위에 열거하지 않은 기타 값들의 조합은 동등하지 않다.
동등함을 테스트하는 예로 다음의 비교식을 살펴보자.
위 표현식은 true를 내놓는다. 겉보기에 매우 다른 값들임에도 불구하고 사실은 동등한 관계인 것이다.
위 표현식에선 먼저 불리언 값 true가 숫자 1로 변환된 후 다시 비교된다. 이어서 문자열 "1"이 숫자 1로 변환된다. 이제 두 숫자는 같은 숫자이기 때문에 비교식의 결과로 true를 반환한다.
2. 부등(!=)과 불일치(!==)
!= 연산자와 !== 연산자가 테스트하는 것은 == 및 === 연산자가 테스트하는 것과 정확히 반대다.
부등 연산자 !=는 두 값이 서로 동등할 경우 false를 반환하며, 그렇지 않을 경우 true를 반환한다.
불일치 연산자 !==는 두 값이 서로 일치할 경우 false를 반환하며, 그렇지 않을 경우 true를 반환한다.
이 연산자는 ECMAScript v3에서 표준화되었으며, 자바스크립트 1.3과 그 이후 버전에 구현되어 있다.
잠시 후 보게 될테지만, ! 연산자는 불리언 NOT 연산을 계산한다. 이 점을 연상하면 !=가 '동등하지 않다'를 나타내며 !==는 '일치하지 않는다'를 나타낸다는 것을 쉽게 떠올릴 수 있을 것이다. 서로 다른 데이터 타입
사이에서 동등과 일치 관계가 어떻게 정의되는지는 이전의 절에서 다루었으니 참조하라.
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 5.6 문자열 연산자 (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 5.5 관계 연산자 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 5.3 산술 연산자 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 5.2 연산자 개요 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 5.1 표현식 (0) | 2010.07.04 |