본 게시물은 Effective Javascript의 내용을 재구성하여 작성되었음을 알립니다. 저작권 문제 발생시 게시물이 비공개 될 수 있습니다.
- == 연산자는 인자들이 서로 다른 데이터형일 때, 일련의 혼동스러운 암묵적인 강제형변환을 적용시킨다.
- 비교가 어떠한 암묵적인 강제 형변환과도 연관이 없다는 사실을 코드를 읽는 사람에게 명확하게 전달하기 위해서 ===을 사용하라.
- 비교할 값이 서로 다른 데이터형이라면 프로그램의 동작을 더 명백히 하기 위해 직접 명시적인 강제 형변환을 사용하라.
다음 표현식의 값이 무엇이라 생각하는가?
"1.0e0" == { valueOf: function() {return true; } };
그냥 보기에도 연관이 없어 보이는 이 두 값은 사실 == 연산자에 의해 동등하다고 간주된다. 왜냐하면 암묵적인 강제 형변환에 의해 두 값은 모두 비교되기 전에 숫자로 변환되기 때문이다. 문자열 "1.0e0"는 숫자 1로, 오른쪽의 객체 역시 valueOf 메서드가 호출된 결과인 true가 다시 숫자로 변환되어 1로 처리된다.
웹 입력 양식에서 값을 읽어와 숫자와 비교하는 작업에도 이런 강제 형변환을 사용하곤 한다.
var today = new Date();
if (form.month.value == (today.getMonth() + 1 ) &&
form.day.value == today.getDate() ) {
// ...
}
하지만 사실, 값을 숫자로 명시적으로 변환하기는 매우 쉽다. Number 함수나 단일 + 연산자를 사용하면 된다.
var today = new Date();
if ( +form.month.value == (today.getMonth() + 1 ) &&
+form.day.value == today.getDate() ) {
// ...
}
더 나은 방법으로 엄격한 동일 비교 연산자를 사용할 수 있다.
var today = new Date();
if ( +form.month.value === (today.getMonth() + 1 ) &&
+form.day.value === today.getDate() ) {
// ...
}
두 인자가 동일한 데이터 형이라면 ==와 ===이나 아무런 차이가 없다. 하지만 코드를 읽는 사람에게 형변환이 연관되지 않는다는 점을 확실히 보여주는 더 좋은 방법은 엄격한 동일 비교를 사용하는 것이다. 그렇지 않으면 코드의 동작을 판독하기 위해 정확한 강제 형변환 법칙을 다시 상기시켜 주어야 한다.
인자 타입 1 |
인자 타입 2 |
강제 형변환 |
null |
undefined |
없음; 항상 true |
null 또는 undefined |
null 또는 undefined이 아닌 다른 타입 |
없음; 항상 false |
원시 데이터형 문자열, 숫자 또는 불리언 |
Date 객체 |
원시 데이터형 > 숫자
Date 객체 > 원시 데이터형 (toString 시도 후 valueOf)
|
원시 데이터형 문자열, 숫자 또는 불리언 |
Date가 아닌 객체 |
원시 데이터형 > 숫자 Date가 아닌 객체 > 원시 데이터형 (valueOf 먼저 시도 후 toString) |
원시 데이터형 문자열, 숫자 또는 불리언 |
원시 데이터형 문자열, 숫자 또는 불리언 |
원시 데이터형 > 숫자 |
위의 표는 인자가 서로 다른 데이터형일 때 == 연산자의 강제 형변환 법칙을 보여준다. 대부분의 형변환은 숫자 값을 만드는 시도를 한다. 하지만 객체를 다룰 때는 규칙들이 약간 이상해질 수 있다. 연산자는 valueOf 와 toString 메서드를 호출하여 객체를 원시 데이터형 값으로 변환하려 할 것이고, 그 중 처음으로 얻게 되는 원시 데이터 값을 사용할 것이다. Date 객체는 이 두 메서드를 반대 순서로 시도한다.
== 연산자는 데이터의 다양한 표현에 두루 사용되어 마치 문제 없는 코드처럼 동작하게 한다. 이런 오류 보정은 종종 'do what I mean' 시맨틱(내 듯대로 동작하라) 라고 부른다.
요약.
- == 연산자는 인자들이 서로 다른 데이터형일 때, 일련의 혼동스러운 암묵적인 강제형변환을 적용시킨다.
- 비교가 어떠한 암묵적인 강제 형변환과도 연관이 없다는 사실을 코드를 읽는 사람에게 명확하게 전달하기 위해서 ===을 사용하라.
- 비교할 값이 서로 다른 데이터형이라면 프로그램의 동작을 더 명백히 하기 위해 직접 명시적인 강제 형변환을 사용하라.
끄읕.