Symbol.toPrimitive

Baseline 已廣泛支援

該特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 2017 年 4 月以來,它已在各大瀏覽器上可用。

Symbol.toPrimitive 靜態資料屬性表示 知名 Symbol Symbol.toPrimitive。所有 型別強制轉換 演算法都會在物件上查詢此 Symbol,以獲取接受首選型別並返回物件的原始表示形式的方法,然後再回退使用物件的 valueOf()toString() 方法。

試一試

const object = {
  [Symbol.toPrimitive](hint) {
    if (hint === "number") {
      return 42;
    }
    return null;
  },
};

console.log(+object);
// Expected output: 42

知名 Symbol Symbol.toPrimitive

Symbol.toPrimitive 的屬性特性
可寫
可列舉
可配置

描述

藉助 Symbol.toPrimitive 屬性(用作函式值),物件可以轉換為原始值。該函式以字串引數 hint 呼叫,該引數指定結果原始值的首選型別。hint 引數可以是 "number""string""default" 之一。

"number" 提示由 數字強制轉換 演算法使用。"string" 提示由 字串強制轉換 演算法使用。"default" 提示由 原始值強制轉換 演算法使用。hint 僅作為首選項的弱訊號,實現可以自由忽略它(如 Symbol.prototype[Symbol.toPrimitive]() 所做的那樣)。語言不強制 hint 與結果型別對齊,儘管 [Symbol.toPrimitive]() 必須返回一個原始值,否則會丟擲 TypeError

沒有 [Symbol.toPrimitive] 屬性的物件透過以不同順序呼叫 valueOf()toString() 方法轉換為原始值,這在 型別強制轉換 部分有更詳細的解釋。[Symbol.toPrimitive]() 允許對原始值轉換過程進行完全控制。例如,Date.prototype[Symbol.toPrimitive]()"default" 視為 "string" 並呼叫 toString() 而不是 valueOf()Symbol.prototype[Symbol.toPrimitive]() 會忽略提示並始終返回一個 Symbol,這意味著即使在字串上下文中,也不會呼叫 Symbol.prototype.toString(),並且 Symbol 物件必須始終透過 String() 顯式轉換為字串。

示例

修改從物件轉換的原始值

以下示例描述了 Symbol.toPrimitive 屬性如何修改從物件轉換的原始值。

js
// An object without Symbol.toPrimitive property.
const obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"

// An object with Symbol.toPrimitive property.
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"

規範

規範
ECMAScript® 2026 語言規範
# sec-symbol.toprimitive

瀏覽器相容性

另見