2020-05-09

                            如何让 (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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。