Symbol.toPrimitive

Symbol.toPrimitive 정적 데이터 속성은 잘 알려진 심볼 @@toPrimitive를 나타냅니다. 모든 타입 강제 변환 알고리즘은 객체에서 이 심볼을 찾아서 선호하는 유형을 허용하고 객체의 원시 표현을 반환하는 메서드를 찾은 다음 객체의 valueOf()toString() 메서드를 다시 사용합니다.

시도해보기

잘 알려진 심볼 @@toPrimitive.

Property attributes of Symbol.toPrimitive
Writable 불가능
Enumerable 불가능
Configurable 불가능

설명

함수 값으로 사용되는 Symbol.toPrimitive 속성의 도움으로 객체를 원시 값으로 변환할 수 있습니다. 함수는 결과로 나온 원시 값의 선호 유형을 지정하는 문자열 인수 hint와 함께 호출됩니다. hint 인수는 "number" "string", "default"중 하나일 수 있습니다.

"number" 힌트는 숫자 강제 알고리즘에서 사용됩니다. "string" 힌트는 문자열 강제 알고리즘에서 사용됩니다. "default" 힌트는 원시형 강제 알고리즘에서 사용됩니다. hintSymbol.prototype[@@toPrimitive]()와 같이 선호 사항정도로만 작용하며, 구현은 이를 무시할 수 있습니다. 언어에서는 hint와 결과 유형 간의 정렬을 강제하지 않지만, [@@toPrimitive]()는 원시형을 반환해야 하며, 그렇지 않으면 TypeError가 발생합니다.

@@toPrimitive 속성이 없는 객체는 valueOf()toString() 메서드를 다른 순서로 호출하여 원시형으로 변환되며, 이에 대한 자세한 설명은 타입 강제 섹션에서 확인할 수 있습니다. @@toPrimitive를 사용하면 윈시형 변환 절차를 완전히 제어할 수 있습니다. 예를 들어, Date.prototype[@@toPrimitive]"default""string"으로 취급하여 valueOf() 대신 toString()을 호출합니다. Symbol.prototype[@@toPrimitive]는 힌트를 무시하고 항상 심볼을 반환하므로 문자열 컨텍스트에서도 Symbol.prototype.toString()이 호출되지 않으며, Symbol 객체는 항상 String()을 통해 명시적으로 문자열로 변환해야 합니다.

예제

객체에서 변환된 원시값 수정하기

다음 예제에서는 Symbol.toPrimitive 속성이 객체에서 변환된 원시값을 수정하는 방법을 설명합니다.

js
// Symbol.toPrimitive 속성이 없는 객체.
const obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"

// Symbol.toPrimitive 속성이 있는 객체.
const obj2 = {
  [Symbol.toPrimitive](hint) {
    if (hint === "number") {
      return 10;
    }
    if (hint === "string") {
      return "hello";
    }
    return true;
  },
};
console.log(+obj2); // 10        — hint is "number"
console.log(`${obj2}`); // "hello"   — hint is "string"
console.log(obj2 + ""); // "true"    — hint is "default"

명세서

Specification
ECMAScript Language Specification
# sec-symbol.toprimitive

브라우저 호환성

BCD tables only load in the browser

같이 보기