# 当a等于什么的时候,下面判断可以成立
// var a=?;
if ( a == 1 && a == 2 && a == 3 ){
console.log('成立');
}
# 关于 == 的一些规律
# 一、对象 == 字符串:对象toString()变为字符串,再比较
# 二、null == undefined 相等,但是和其他值比较不在相等
# 三、NaN == NaN 不相等 NaN和谁都不相等
# 四、剩下的都是转换为数字
# 1、对象转换成数字:先valueOf(),再toString(),再Number()
#
# TO_STRING实现
根据上面的第四条,我们可以看到,如果a是一个对象的话,在判断==的时候,会先调用valueOf(),再toString(),再Number() 所以我们可以重写a的valueOf()或者toString(),如下代码
var a = {
i : 0,
valueOf(){
return ++this.i;
}
}
// 或者
var a = {
i : 0,
toString(){
return ++this.i;
}
}
# 数据劫持实现
利用ES5中的defineProperty方法,再获取对象a的时候在get()方法中劫持,并返回我们指定的值。如下代码。
var i = 0;
Object.defineProperty(window, 'a', {
get() {
return ++i;
}
});
if (a == 1 && a == 2 && a == 3) {
console.log('成立');
}