# 当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('成立');
}
Last Updated: 5/30/2022, 3:18:49 PM