前言
今天在网上看到一道有趣的题,问(a== 1 && a ==2 && a==3)可能为true吗?研究了一下竟然发现是可以的。
valueOf和toString
- 首先大家都知道使用==会进行数据类型转换,例如1==‘1’,同时对象也是可以进行转换的,看代码:
let a={}
console.log(a.valueOf());
console.log(a.toString());
console.log(a=='[object Object]')
//{}
//[object Object]
//true
可以看到当使用==时候调用了对象的toString()方法。
- 实现
因此可以借助这个方法实现(a== 1 && a ==2 && a==3)=true
let a={
i:1,
toString(){
return a.i++
}
}
console.log(a==1&&a==2&&a==3)
//true
- 说明
执行a==1时候首先会调用valueOf判断类型是否一致,不一致的话再调用toString(),此时返回a.i并同时++就可以以此类推,最后a.i==4。
网友评论