Symbol.toPrimitive

Symbol.toPrimitive 静态数据属性表示 众所周知的符号 Symbol.toPrimitive。所有 类型强制 算法都在对象上查找此符号,以获取接受首选类型并返回对象的基本表示形式的方法,然后再回退到使用对象的 valueOf()toString() 方法。

试一试

众所周知的符号 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.prototype.toString(),并且必须始终通过 String()Symbol 对象显式转换为字符串。

示例

修改从对象转换的基本值

以下示例描述了 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 语言规范
# sec-symbol.toprimitive

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅