在进行转换时候,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);

结果:

JavaScript对象与原始值的转换4_字符串

关于toString和valueOf以前使用的转换方式,那时候还没有symbol这个概念,

这些方法必须返回一个原始值。如果 toString 或 valueOf 返回了一个对象,那么返回值会被忽略。默认情况下,普通对象具有 toString 和 valueOf 方法:

toString 方法返回一个字符串 "[object Object]"。

valueOf 方法返回对象自身。

例子:

let user = {name: "John"};

console.log(user);

console.log(user.valueOf() === user);

结果:

JavaScript对象与原始值的转换4_字符串_02