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
属性如何修改从对象转换的基本值。
// 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 的浏览器中加载。