이 절에서는 자바스크립트 관계 연산자들을 설명한다.
이 연산자들은 두 값의 관계(예를 들면 '더 작다'라든가 '~의 프로퍼티다' 등을 말함)를 테스트하고
해당 관계가 존재하는지 여부에 따라 true 또는 false를 반환한다. 6장에서 나올 테지만,
이들 연산자는 if 문이자 while 루프의 같은 구조에서 프로그램 실행의 흐름을 제어하기 위한 용도로
널리 사용된다.
1. 비교 연산자
관계 연산자 중에서 가장 널리 쓰이는 종류는 비교 연산자다.
비교 연산자는 두 값의 상대적인 순서를 판단하는데 쓰인다. 아래에 나열된 비교 연산자들을 살펴보자.
더 작다(<)
< 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 작으면 true로, 그렇지 않으면 false로 평가된다.
더 크다(>)
> 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 크면 true로, 그렇지 않으면 false로 평가된다.
더 작거나 같다(<=)
<= 연산자는 첫번째 피연산자가 두 번째 피연산자보다 작거나 같으면 true로, 그렇지 않으면 false로 평가된다.
더 크거나 같다(>=)
>= 연산자는 첫번째 피연산자가 두 번째 피연산자보다 크거나 같으면 true로, 그렇지 않으면 false로 평가된다.
위의 비교 연산자는 피연산자 타입에 제한이 없다. 하지만 오직 숫자와 문자열만 비교할 수 있기 때문에 숫자나 문자열이 아닌 피연산자는 먼저 변환된다. 비교와 변환은 다음과 같이 일어난다.
- 두 피연산자가 모두 숫자이거나 또는 둘 다 숫자로 변환할 수 있으며 이 둘은 숫자로 비교된다.
- 두 피연산자가 모두 문자열이거나 또는 둘다 문자열로 변환할 수 있으면 이 둘은 문자열로 비교된다.
- 한 피연산자는 문자열(또는 문자열로 변환 가능)이고 다른 하나는 숫자(또는 숫자로 변환 가능)라면, 비교 연산자는 먼저 문자열을 숫자로 변환하여 이들을 숫자로서 비교하려 시도할 것이다. 만일 여기서 문자열이 나태내는 것이 숫자가 아니라면, 이 문자열은 NaN으로 변환된 후 비교 결과는 false다. (자바스크립트 1.1에서는 이러한 문자열을 숫자로 비교하면 NaN을 내놓는 대신 에러가 일어났다.)
- 어떤 객체를 숫자나 문자열로 변환할 수 있으며 자바스크립트는 숫자 변환을 수행한다. 이 말은 예를 들어 Date 객체는 숫자로서 비교된다는 것을 뜻한다. 두 날짜 중 어느것이 더 앞서는지 확인할 경우가 있을 테니 Date를 숫자로서 비교하는 것이 말이 된다.
- 비교 연산자의 피연산자가 숫자나 문자열로 변환되지 못할 경우엔 언제나 false를 반환한다.
- 둘 중 하나의 피연산자가 NaN이거나 NaN으로 변환된다면 비교 연산자는 언제나 false를 반환한다.
문자열이 비교될 때에는 Unicode로 인코딩 된 각 문자에 해당하는 숫자값 기준으로 엄격히 문자 대 문자로 비교된다는 것을 유념해야 한다. Unicode 표준에는 어떤 문자열을 원래와 다른 순서의 문자 조합으로 인코딩해도 동일한 문자열을 표현할 수 있는 경우가 있지만, 자바스크립트의 비교 연산자는 이와 같은 인코딩 방법의 차이를 인식하지 못한다. 자바스크립트 비교 연산자는 모든 문자열이 정규 형식으로 표현되어 있다고 가정한다. 또한 문자열 비교는 대소문자를 구분한다는 점을 염두에 두어야 한다. Unicode 인코딩에선 (적어도 ASCⅡ에 해당하는 부분에서) 모든 대문자는 모든 소문자보다 '작다'. 이 점을 미리 알지 못한 경우 문자열 비교 결과에 혼란을 겪을 수 있다. 예를 들면 < 연산자에 대해 문자열 "Zoo"는 문자열 "aardvark" 보다 작다.
인코딩 차이와 같은 다양성을 고려하는 문자열 비교 알고리즘으로 String.localCompare() 메서드가 있다. 이 메서드에서는 각 로케일에 따른 알파벳 순서를 고려한다. 대소문자를 구분하지 않고 문자열을 비교하려면 우선 String.toLowerCase()나 String.toUppercase() 메서드를 사용해서 비교할 문자열을 전부 소문자 또는 대문자로 변환해야 한다.
<= 연산자(더 작거나 같다) 와 >= 연산자(더 크거나 같다)에서는 두 값이 '같은지' 판단하는데 동등 연산자나 일치 연산자의 힘을 빌리지 않는다. 대신, '더 작거나 같다' 연산자는 단순히 '크지 않다' 로 정의되며 '더 크거나 같다' 연산자는 단순히 '작지 않다'로 정의된다. 단 한 가지 예외가 있는데, 두 개의 피연산자 중 하나가 NaN이면 (또는 NaN으로 변환되면) 네 종류의 비교 연산자 모두 false를 반환한다.
2. in 연산자
in 연산자는 좌변의 피연산자로 문자열(또는 문자열로 변환되는 것)을 받는다.
우변의 피연산자로는 객체나 배열을 받는다.
좌변 값이 우변 객체의 프로퍼티 이름에 해당할 경우 연산 결과는 true다.
예를 들어보자.
var point = { x:1, y:1 }; // 객체 정의
var has_x_coord = "x" in point; // true
var has_y_coord = "y" in point; // true
var has_z_coord = "z" in point; // false. point 는 3차원 공간의 점이 아니다.
var ts = "toString" in point; // 상속된 프로퍼티. true.
3. instanceof 연산자
instanceof 연산자는 좌변의 피연산자로 객체를 우변의 피연산자로 객체 클래스의 이름을 받는다.
좌변 객체가 우변 클래스의 인스턴스일 경우 연산 결과는 true이고 그렇지 않을 경우 false다.
9장에서 설명할 내용이지만, 자바스크립트에서 객체의 클래스는 그 객체를 초기화 하는 생성자 함수에서
정의된다. 따라서 instanceof의 우변 피연산자는 생성자 함수 중 하나의 이름이어야 한다.
또한 모든 객체는 Object의 인스턴스임을 기억하라.
예를 들어보자.
d instanceof Date; // true. d는 Date()에 의해 생성되었다.
d instanceof Ojbect; // true. 모든 객체는 Ojbect의 인스턴스.
d instanceof Number; // false. d는 Number 객체가 아니다.
var a = [1, 2, 3]; // 배열 리터럴 문법으로 새로운 배열을 생성한다.
a instanceof Array; // true. a는 배열이다.
a instanceof Object; // true. 모든 배열은 객체다.
a instanceof RegExp; // false. 배열은 정규 표현식이 아니다.
만일 instanceof의 좌변 피연산자가 객체가 아니거나 우변 피연산자가 어떤 생성자 함수에도 해당하지 않는 객체라면 instanceof의 결과는 false다. 그러나 우변 피연산자가 아예 객체가 아닌 경우에는 런타임 에러가
발생한다.
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 5.7 논리 연산자 (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 5.6 문자열 연산자 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 5.4 동등 연산자 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 5.3 산술 연산자 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 5.2 연산자 개요 (0) | 2010.07.04 |