js对象转原始类型

JavaScript对象在转换类型的时候,会调用内置的[[ToPrimitive]]函数。

清晨的阳光

这个函数的算法逻辑是这样的:

1、如果已经是原始类型,那就无需转换了。

2、如果需要转字符串类型就调用x.toString(),转换为基础类型的话就返回转换的值。不是字符串类型的话就先调用valueOf,结果不是基础类型的话再调用toString

3、调用x.valueOf(),如果转换为基础类型,就返回转换的值。

4、如果都没有返回原始类型,则报错。

当然我们也可以重写 Symbol.toPrimitive ,该方法在转原始类型时调用优先级最高。

let a = {
  valueOf() {
    return 0
  },
  toString() {
    return '1'
  },
  [Symbol.toPrimitive]() {
    return 2
  }
}

console.log(1 + a) // 3