1.双等号
双等号和===的区别是双等号两边数据类型不同会尝试将他们转化为同一类型。这里涉及基础数据类型转换和隐式转换。
1.1_隐式转换中的对象
valueOf和toString这两个方法是每个对象都自带的。定义一个简单的对象然后调用他的这两个方法看下结果。可以看到toString返回一个字符串"[object Object]"。
valueOf则是直接返回对象本身。c=="[object Object]"
也为true则说明了在隐式转换的过程中,调用了c对象的toString方法。
因此,可以利用对象的隐式转换让式子成立。即下面代码。
var a={
i:1,
toString:function(){
return a.i++
}
};
if(a==1&&a==2&&a==3){
console.log('式子成立');
}
【分析过程】执行a==1,引擎执行a.valueOf判断两边是否成立,a.value0f返回的是字串'[object Object]",所以式子不成立,引擎继续调用toString方法,这里重写了a对象的toString方法,返回数字并++,可以发现式子依次成立。
总结:为了解决这个问题才重写了对象的toString方法,但是实际项目中不会去重写原生对象的方法。
说明:本文章学习了gecko大佬,然后在自己的理解上重新书写了此道题目的解决办法。