Skip to content

什么是Symbol.toPrimitive?

Symbol.toPrimitive 允许我们将对象描述为原始值转换

  • 如果没有 Symbol.toPrimitive,那么 JavaScript 将尝试寻找 toString 和 valueOf 方法
  • string优先调用toString,其他优先调用valueOf; 这两个方法必须返回一个原始值。如果 toString 或 valueOf 返回了一个对象,那么返回值会被忽略
  • 默认情况下,普通对象具有 toString 和 valueOf 方法: toString 方法返回一个字符串 "[object Object]"。 valueOf 方法返回对象自身
js
let user = {name: "John"};

alert(user); // [object Object]
alert(user.valueOf() === user); // true

注意: 没有限制 toString() 是否返回字符串,或 Symbol.toPrimitive 方法是否为 "number" hint 返回数字。 唯一强制性的事情是:这些方法必须返回一个原始值,而不是对象。

js
 [Symbol.toPrimitive](hint) {
              alert(`hint: ${hint}`);
              return hint == "string" ? `{name: "${this.name}"}` : this.money;
 }
    //等价于
 toString() {
              return `{name: "${this.name}"}`;
 }
valueOf() {
      return this.money;
  }

总结

转换算法是:

调用 obj[Symbol.toPrimitive](hint) 如果这个方法存在, 否则,如果 hint 是 "string"

尝试调用 obj.toString()obj.valueOf(),无论哪个存在。 否则,如果 hint 是 "number" 或者 "default"

尝试调用 obj.valueOf()obj.toString(),无论哪个存在。