第一种:
const a={
i:1,
toString:function(){
return a.i++;
}
}
if(a==1&&a==2&&a==3){console.log("ok")}else{console.log("no")}
第二种:
var val=0;
Object.defineProperty(window,'a',{
get:function(){
return ++val;
}
})
if(a==1&&a==2&&a==3){console.log("ok")}else{console.log("no")}
解释
第一种:利用松散相等运算符的工作原理
1.严格运算符(===):
1)两个操作数1类型不同,返回false
2)操作数存在NaN,返回false
3)二者都为null或都为undefined,返回true;一个为NaN,一个为undefined,返回false
4)操作数都为true或都为false,返回true
5)操作数都为数字,且值相等,返回true(-0===0,返回true)
6)都为字符串,且字符相等,返回true
7)两个引用指向同一个对象、函数或数组时,返回true
2.松散运算符(==):
1)一个是null,一个是undefined,返回true
2)一个值是字符串,一个是数字,将字符串装换为数字,再比较
3)其中一个操作数为true或false,先转换为1或0再比较(true:1,false:0)
4)如果一个值为对象,另一个为数字或字符串,会将对象转换为1原始值(valueof函数)
5)其他不同类型的值都不相等
第二种:劫持JS对象的getter,这种情况下(===)也适用