3.5.3절에서 설명한 바와 같이 일반적으로 객체는 기본 타입으로 손쉽게 변환이 된다.
그러나 이 변환 과정에 대한 몇 가지 세부 내용에 대한 논의가 더 필요하다.[각주:1]
먼저 null이 아닌 객체가 불리언 문맥에서 사용되면 true로 변환된다. 이것은 모든 객체에 대해 동일하다.
배열, 함수, 심지어 false로 변환되는 기본값을 나타내는 래퍼 객체라 하더라고 그렇다.
예를 들어, 다음에 나오는 모든 객체들은 불리언 문맥에서 사용될 때 true로 변환된다.
new Boolean(false); // 내부 값은 false이지만 객체는 true로 변환된다.
new Number(0);
new String(" ");
new Array();
표 3-3에서 먼저 valueOf()가 호출되어 객체가 숫자로 변환된다는 것을 보았다. 대부분의 객체는 Object의
기본 valueOf() 메서드를 상속받으며 이 메서드는 간단히 객체 그 자체를 반환한다.
기본 valueOf() 메서드는 기본 데이터 타입 값을 반환하지 않기 때문에, 자바스크립트는 다음으로 toString() 메서드를 호출하고 반환되는 문자열을 숫자로 변환함으로써 객체를 숫자로 변환하려고 시도한다.
배열에서는 흥미로운 결과가 나타난다. 배열의 toString() 메서드는 각 배열 원소를 문자열로 변환하고
배열 원소 사이에 쉼표를 삽입하여 이어 붙인 문자열을 결과가 반환한다.
따라서 아무 원소도 없는 배열은 빈 문자열로 변환되고 이것은 숫자 0으로 변환된다! 또한, 배열이 단일 원소로 숫자 n을 갖고 있으면, 배열은 n의 문자열 표현으로 변환되고 이것은 다시 숫자 n으로 변환된다.
배열의 원소가 둘 이상이거나, 숫자가 아닌 원소가 있으면 배열은 NaN으로 변환된다.
값의 변환은 그 값이 사용되는 문맥에 따라 이루어진다.
자바스크립트에는 이러한 문맥이 불문명한 몇몇 상황이 존재한다. + 연산자와 비교 연산자(<, <=, >, >=)는 숫자와 문자열 둘 다에 대해 작동한다. 따라서 객체가 이 연산자들 중 하나와 함께 사용될 경우, 숫자로 변환되어야 하는지 문자열로 변환되어야 하는지가 명확하지 않다. 대부분의 경우 자바스크립트는 객체의 valueOf() 메서드를 호출하여 객체를 변환하려고 한다. 만약 이 메서드가 기본 데이터 타입 값을 반환하면(보통 숫자) 그 값이 사용된다. 그러나 종종 valueOf()가 단순히 변환되지 않는 객체를 반환할 수도 있다. 이때 자바스크립트는 객체의 toString() 메서드를 호출하여 객체를 문자열로 변호나하려고 시도한다.
이 변환 규칙에는 한 가지 예외가 있다. Date 객체가 + 연산자와 함께 사용되면, 변환에 toString() 메서드가 사용된다. 그 이유는 Date에 toString() 메서드와 valueOf() 메서드가 모두 존재하기 때문이다. 여러분이 Date를 +와 함께 사용하는 경우는 대부분 문자열 이어 붙이기를 수행하기 위해서다. 그러나 Date를 비교 연산자와 함께 사용한다면, 대부분 두 날짜 중 어느 것이 더 빠른지 결정하려고 숫자 비교를 수행하는 경우일 것이다.
대부분의 객체는 유용한 결과를 반환하는 valueOf() 메서드나 toString() 메서드를 가지고 있지 않다. 객체를 + 연산자와 함께 사용하면 대부분 더하기 결과보다는 문자열을 이어 붙인 결과를 얻는다. 객체를 비교 연산자와 사용하면 보통 문자열 이어 붙이기보다는 숫자 비교 결과를 얻는다.
사용자가 정의한 valueOf() 메서드를 가지고 있는 객체는 예상과는 다른 방식으로 작동할 수 있다. valueOf() 메서드가 숫자를 반호나하도록 정의하면, 산술 연산자나 기타 연산자와 함께 객체를 사용할 수 있다. 그러나 객체를 문자열에 이어 붙이려는 경우에는 원하는 결과를 얻지 못할 것이다. 이 경우에 toString() 메서드는
더이상 호출되지 않으며, valueOf() 메서드에 의해 반환되는 숫자를 문자열로 표현한 것이 문자열에 이어
붙여진다.
마지막으로, valueOf() 가 toNumber()[각주:2] 라는 이름이 아님을 기억하라.
정확하게 말하면 valueOf() 메서드의 역활은 객체를 적절한 기본 타입 값으로 변환하는 것이다.
따라서 객체에 따라서 valueOf() 메서드가 문자열을 반환할 수도 있다.
1) 이번 절에서는 고급 주제를 다룬다. 이 절을 처음 읽는다면 그냥 건너뛰어도 좋다. [본문으로]
2) (역자 주) 'toNumber'는 '숫자로'라는 의미이다. [본문으로]
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 4.1 변수 타입, 4.2 변수 선언 (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 3.15 값에 의한 vs. 참조에 의한 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 3.13 기본 데이터 타입 래퍼 객체 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 3.11 Error 객체, 3.12 타입 변환 요약 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 3.10 정규 표현식 (0) | 2010.07.04 |