var a = ?;
if (a == 1 && a == 2 && a == 3) {
    console.log(1);
}

两个等于号转化数据类型值相等,三个等于好要绝对相等

双等

  • 对象== 字符串 对象toString变成字符串,再变成数字,对比;[10] == 10
  • null == undefined但是和其他比较不想等
  • NaN和任何东西都不想等
  • 剩下的都转化成数字。eg. '1'==true

1、利用toString

由于两个等号对比,一方为数字,我们假设a为object(例如:[1],[2],[3]这样的,数组是特殊的object),那么他们执行的对比方式一定是要先toString再转化成数字进行对比的。因此我们可以在toString上做文章,去修改它的toString

var a = {
  i:0,
  toString(){
    return ++this.i;
  }
}
//因此三次对比,执行三次toString,依次返回1,2,3。valueOf也可以代替toString



var a= [1,2,3]
a.toString = a.shift;    //shift方法删除数组第一个值,并且返回第一个数值。因此每次对比要调用a的toString的时候,依次获得的数值就是i,2,3

2、利用数据劫持get:

由于a是全局的,那么再全局上去劫持获取a的set方法去修改

var i = 0;
Object.definedProperty(window,'a',{
  set(){
    return ++i;
  }
})

3、或者用true也行

results matching ""

    No results matching ""