원시값을 기대하는 내장 함수나 연산자를 사용할 때 객체-원시형으로의 형 변환이 자동으로 일어납니다.
객체-원시형으로의 형 변환은 hint를 기준으로 세 종류로 구분할 수 있습니다.
"string"
(alert
같이 문자열을 필요로 하는 연산)"number"
(수학 연산)"default"
(드물게 발생함)연산자별로 어떤 hint가 적용되는지는 명세서에서 찾아볼 수 있습니다. 연산자가 기대하는 피연산자를 '확신할 수 없을 때’에는 hint가 "default"
가 됩니다. 이런 경우는 아주 드물게 발생합니다. 내장 객체는 대개 hint가 "default"
일 때와 "number"
일 때를 동일하게 처리합니다. 따라서 실무에선 hint가 "default"
인 경우와 "number"
인 경우를 합쳐서 처리하는 경우가 많습니다.
객체-원시형 변환엔 다음 알고리즘이 적용됩니다.
obj[Symbol.toPrimitive](hint)
메서드가 있는지 찾고, 있다면 호출합니다."string"
이라면,obj.toString()
이나 obj.valueOf()
를 호출합니다."number"
나 "default"
라면obj.valueOf()
나 obj.toString()
을 호출합니다.obj.toString()
만 사용해도 '모든 변환’을 다 다룰 수 있기 때문에, 실무에선 obj.toString()
만 구현해도 충분한 경우가 많습니다. 반환 값도 ‘사람이 읽고 이해할 수 있는’ 형식이기 때문에 실용성 측면에서 다른 메서드에 뒤처지지 않습니다. obj.toString()
은 로깅이나 디버깅 목적으로도 자주 사용됩니다.
true
를 반환합니다. 단 하나의 예외도 없죠. 따라서 객체는 숫자형이나 문자형으로만 형 변환이 일어난다고 생각하시면 됩니다.true
로 평가됩니다. 게다가 우리도 내장 객체에 사용되는 규칙처럼 "default"
와 "number"
를 동일하게 처리하면, 결국엔 두 종류의 형 변환(객체-문자형, 객체-숫자형)만 남게 됩니다.