为什么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);