由一道题引出的两类结题方案

133 阅读1分钟

首先来看这道题

var a等于什么值得时候
能打印出“打印成功”
if(a==1&&a==2&&a=3){
    console.log('打印成功');
}

方法一:利用toString方法。

关于‘==’与‘===’的区别,‘===’是值相等,类型也相等,而‘==’只需要值相等就可以,在进行比较中,toString()方法的原理:

   1.当对象==字符串,对象.toString()方法会先把对象转化成字符串,然后比较
   2.null==undefined 相等,但是和其他值比起来都不相等了
   3.NaN==NaN 不相等
   4.剩下的都会转化为数值

所以可以重写toString方法:

    var a={
        i=0;
        toString:(){
            return ++this.i;
        }
    }
    if(a==1&&a==2&&a=3){
        console.log('打印成功');
    }

在每次比较的时候都调用了toString方法,使值自增1,然后就刚好全部相等了。

另一种方法,利用数组的shift

     var a=[1,2,3];
     a.toString=a.shift();
     if(a==1&&a==2&&a=3){
        console.log('打印成功');
    }

方法二,利用数据劫持

对于Object.defineProperty(),有get()方法和set()方法,监听值后,每次获取这个值调用get()方法,每次设置这个值得时候调用set()方法。因为每次判断a==1时需要先获取a的值,然后再判断是否相等,故可以使用obj.defineProperty()

var i=0;
var a;
Object.defineProperty(window,'a',{
    get(){
        return ++i;
    }
})
if(a==1&&a==2&&a=3){
    console.log('打印成功');
}