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

浏览器兼容性

另见