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