在进行转换时候,JavaScript 一次尝试调用三个对象方法:
调用 obj[Symbol.toPrimitive](hint) — 带有 symbol 键 Symbol.toPrimitive(系统 symbol)的方法,如果这个方法存在的话,
否则,如果 hint 是 "string" — 尝试 obj.toString() 和 obj.valueOf(),无论哪个存在。
否则,如果 hint 是 "number" 或 "default" — 尝试 obj.valueOf() 和 obj.toString(),无论哪个存在。
Symbol.toPrimitive
的内建 symbol方法。
例子:
let user = {
name: "John",
money: 1000,
[Symbol.toPrimitive](hint) {
console.log(`hint: ${hint}`);
return hint == "string" ? `{name: "${this.name}"}` : this.money;
}
};
console.log(user);
console.log(+user);
console.log(user + 500);
结果:
关于toString和valueOf以前使用的转换方式,那时候还没有symbol这个概念,
这些方法必须返回一个原始值。如果 toString 或 valueOf 返回了一个对象,那么返回值会被忽略。默认情况下,普通对象具有 toString 和 valueOf 方法:
toString 方法返回一个字符串 "[object Object]"。
valueOf 方法返回对象自身。
例子:
let user = {name: "John"};
console.log(user);
console.log(user.valueOf() === user);
结果: