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'에 명시된 자료형으로의 형 변환을 보장해 주지 않음

- 확신할 수 있는 것은 객체가 아닌 원시값을 반환해 준다는 것뿐