如何让 (a == 1 && a == 2 && a == 3) 的值为true?
==操作符在左右数据类型不一致时,会先进行隐式转换。
a == 1 && a == 2 && a == 3的值意味着其不可能是基本数据类型。因为如果 a 是 null 或者是 undefined bool类型,都不可能返回true。
因此可以推测 a 是复杂数据类型,JS 中复杂数据类型只有object,回忆一下,Object 转换为原始类型会调用什么方法?
如果部署了[Symbol.toPrimitive]接口,那么调用此接口,若返回的不是基本数据类型,抛出错误。
如果没有部署[Symbol.toPrimitive]接口,那么根据要转换的类型,先调用valueOf/toString
非Date类型对象,hint是default时,调用顺序为:valueOf>>>toString,即valueOf返回的不是基本数据类型,才会继续调用valueOf,如果toString返回的还不是基本数据类型,那么抛出错误。
如果hint是string(Date对象的hint默认是string) ,调用顺序为:toString>>>valueOf,即toString返回的不是基本数据类型,才会继续调用valueOf,如果valueOf返回的还不是基本数据类型,那么抛出错误。
如果hint是number,调用顺序为:valueOf>>>toString
部署[Symbol.toPrimitive]接口
利用数据劫持(Proxy/Object.defineProperty)
数组的 toString 接口默认调用数组的 join 方法,重写 join 方法
let a = { i: 1, toString () { return a.i++ } } //利用toString
let a = { i: 1, valueOf () { return a.i++ } } //利用valueOf