Language/JavaScript
[모던 JavaScript] 4.8 객체를 원시형으로 변환하기
뚜sh뚜sh
2023. 1. 31. 18:35
객체-원시형으로의 형 변환은 hint를 기준으로 세 종류로 구분할 수 있음
- "string" (alert 같이 문자열을 필요로 하는 연산)
- "number" (수학 연산)
- "default" (드물게 발생함)
자바스크립트는 형 변환이 필요할 때, 아래와 같은 알고리즘에 따라 원하는 메서드를 찾고 호출함
1. 객체에 obj[Symbol.toPrimitive](hint) 메서드가 있는 지 찾고, 있다면 메서드를 호출함
Symbol.toPrimitive는 시스템 심볼로, 심볼형 키로 사용됨
2. 1에 해당하지 않고 hint가 "string"이라면, obj.toString() 이나 obj.valueOf() 를 호출함 (존재하는 메서드만 실행됨)
3. 1과 2에 해당하지 않고, hint가 "number"나 "default"라면, obj.valueOf() 나 obj.toString() 을 호출함 (존재하는 메서드만 실행됨)
Symbol.toPrimitive
- 자바스크립트엔 Symbol.toPrimitive 라는 내장 심볼이 존재하는데, 이 심볼은 아래와 같이 목표로 하는 자료형(hint)을 명명하는데 사용됨
obj[Symbol.toPrimitive] = function(hint) {
// 반드시 원시값을 반환해야 합니다.
// hint는 "string", "number", "default" 중 하나가 될 수 있습니다.
};
// ex
let user = {
name: "John",
money: 1000,
[Symbol.toPrimitive](hint) {
alert(`hint: ${hint}`);
return hint == "string" ? `{name: "${this.name}"}` : this.money;
}
};
// 데모:
alert(user); // hint: string -> {name: "John"}
alert(+user); // hint: number -> 1000
alert(user + 500); // hint: default -> 1500
toString과 valueOf
- hint가 'string'인 경우 : toString -> valueOf 순
- 그 외 : valueOf -> toString 순
- toString 은 문자열 "[object Object]"을 반환함
- valueOf 는 객체 자신을 반환함
반환 타입
- 위에서 소개한 세 개의 메서드는 'hint'에 명시된 자료형으로의 형 변환을 보장해 주지 않음
- 확신할 수 있는 것은 객체가 아닌 원시값을 반환해 준다는 것뿐