为什么a==1&&a==2&&a==3为true?

231 阅读1分钟

为什么a==1&&a==2&&a==3为true?

对象隐转方法

在双等号操作符中,对象允许类型转化为数字或者字符串在进行比较,如果等号一边是数字先转化为数字比较,valueOf的返回值代表对象的数字值.这种转化成为toPrimitive操作。如果没有valueOf方法就会使用toString方法的返回值来进行比较。

let a = {
	index:1,
	valueOf(){
    	return this.index++;
    }
}
console.log(a==1&&a==2&&a==3) //true
let b = {
	index:1,
	toString(){
    	return this.index++;
    }
}
console.log(b==1&&b==2&&b==3) //true

getter

使用getter可以在访问某个对象属性的时候先进去get函数,然后用get函数的返回值作为被访问得到的值

// 如果if判断没有在函数或者块里面,a可以看做window.a 效果是一样的
window.index = 1;
Object.defineProperty(window, 'a', {
  get() {
    return index++;
  }
});

if (a === 1 && a === 2 && a === 3) {
  console.log('yo!');
}

数组隐转方法

在数组用双等号判断时候会调用join变为字符串再去比较,因此只要改变数组的join方法可以改变结果.

let a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);