obj1 + obj2 처럼 객체끼리 더하는 연산을 하거나, obj1 - obj2 처럼 객체끼리 빼는 연산을 하면 어떤 일이 일어날까요? alert(obj)로 객체를 출력할 때는 무슨 일이 발생할까요?
이 모든 경우에 자동 형 변환이 일어납니다. 객체는 원시값으로 변환되고, 그 후 의도한 연산이 수행됩니다.
형 변환 챕터에선 객체의 형 변환은 다루지 않았습니다. 원시형 자료가 어떻게 문자, 숫자, 논리형으로 변환되는지만 알아보았죠. 이젠 메서드와 심볼에 대한 지식을 갖추었으니 본격적으로 이 공백을 메꿔봅시다.
- 객체는 논리 평가 시
true를 반환합니다. 단 하나의 예외도 없죠. 따라서 객체는 숫자형이나 문자형으로만 형 변환이 일어난다고 생각하시면 됩니다. - 숫자형으로의 형 변환은 객체끼리 빼는 연산을 할 때나 수학 관련 함수를 적용할 때 일어납니다. 객체
Date끼리 차감하면(date1 - date2) 두 날짜의 시간 차이가 반환됩니다.Date에 대해선 Date 객체와 날짜에서 다룰 예정입니다. - 문자형으로의 형 변환은 대개
alert(obj)같이 객체를 출력하려고 할 때 일어납니다.
ToPrimitive
특수 객체 메서드를 사용하면 숫자형이나 문자형으로의 형 변환을 원하는 대로 조절할 수 있습니다.
객체 형 변환은 세 종류로 구분되는데, 'hint’라 불리는 값이 구분 기준이 됩니다. 'hint’가 무엇인지는 명세서에 자세히 설명되어 있는데, ‘목표로 하는 자료형’ 정도로 이해하시면 될 것 같습니다.
"string"-
alert함수같이 문자열을 기대하는 연산을 수행할 때는(객체-문자형 변환), hint가string이 됩니다.// 객체를 출력하려고 함 alert(obj); // 객체를 프로퍼티 키로 사용하고 있음 anotherObj[obj] = 123; "number"-
수학 연산을 적용하려 할 때(객체-숫자형 변환), hint는
number가 됩니다.// 명시적 형 변환 let num = Number(obj); // (이항 덧셈 연산을 제외한) 수학 연산 let n = +obj; // 단항 덧셈 연산 let delta = date1 - date2; // 크고 작음 비교하기 let greater = user1 > user2; "default"-
연산자가 기대하는 자료형이 ‘확실치 않을 때’ hint는
default가 됩니다. 아주 드물게 발생합니다.이항 덧셈 연산자
+는 피연산자의 자료형에 따라 문자열을 합치는 연산을 할 수도 있고 숫자를 더해주는 연산을 할 수도 있습니다. 따라서+의 인수가 객체일 때는 hint가default가 됩니다.동등 연산자
==를 사용해 객체-문자형, 객체-숫자형, 객체-심볼형끼리 비교할 때도, 객체를 어떤 자료형으로 바꿔야 할지 확신이 안 서므로 hint는 default가 됩니다.