step1 寻找对象中有无[Symbol.toPrimitive]方法,若没有,进行下一步
如果有,调用该方法
1.若该方法的返回值是原始值,则使用该原始值作为转换结果
const a = {[Symbol.toPrimitive]() {return 1}
}console.log(+a) // 打印1
2.若该方法无返回值,则该对象转原始值的结果为NAN或undefined
const a = {[Symbol.toPrimitive]() {}
}console.log(+a) //打印NAN
console.log(''+a) //打印undefined
3.若该方法的返回值不是原始值(比如对象),则报错
const a = {[Symbol.toPrimitive]() {return {}}
}console.log(+a) // 直接报错TypeError: Cannot convert object to primitive value
step2 寻找对象中有无valueOf方法,若没有,进行下一步
如果有,调用该方法
1.若该方法的返回值是原始值,则使用该原始值作为转换结果
const a = {valueOf () {return 2}
}console.log(+a) // 打印2
2.若返回值不是原始值,进入下一步(不会报错)
step3 寻找对象中有无toString方法,若没有,直接报错
如果有,调用该方法
1.若该方法的返回值是原始值,则使用该原始值作为转换结果
const a = {toString() {return 1}
}console.log(+a) //打印1
2.若返回值不是原始值,抛出异常
