1.利用隐式转换
原理:
规则:当对象和数字比较时,对象首先会调用valueOf(),如果结果是原始值,则返回原始值,否则再调用toString();
因此我们这里重写toString或者valueOf方法即可。
let a = {
_a: 1,
toString: function () {
return a._a++;
}
}
console.log(a == 1 && a == 2 && a == 3);// true
2.利用Object.defineProperty
原理:
Object.defineProperty的运用
let val = 1;
Object.defineProperty(window, "a", {
get: function () {
return val++;
}
})
console.log(a == 1 && a == 2 && a == 3);//true
3.利用数组的隐式类型转换特点 一种特殊且巧妙的方法
原理:
Array进行隐式转换调用valueOf得到[1,2,3]---->得到不是原始值---->调用toStirng();
Array.toString()实际上是内部改写为Array.join(",")这个方法,我们将a.join重写为a.shift。
let a = [1, 2, 3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);//true