1.我们先看一下这道经典题目
var a = ?;
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
2.本片文章提供两种实现思路
- 第一种思路:利用==比较的时候,左右两边数据类型不一致的情况下,浏览器默认进行隐性的转换 对象==数字 => 要把对象转换为数字(先把对象转换为字符串/再把字符串转换为数字) 对象转换为字符串,默认调用的是valueOf()和toString()
//第一种思路是利用valueOf或toStirng方法对象属性进行操作
var a = {
n:0,
//重写toString方法也可以实现
valueOf(){
return ++this.n;
}
};
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
//第二种思想是利用数组的shift方法(返回删除的第一个值)重写a的toString方法
var a = [1, 2, 3];
a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
console.log('OK');
}
- 第二种思路:基于Object.defineProperty进行数据操作监听(数据劫持)
defineProperty是ES6新增的一个方法,具体使用方法可参考官方解释
let i = 0;
Object.defineProperty(window, 'a', {
get() {
// 获取a属性值,就会触发GETTER函数
return ++i;
},
// 设置属性a的值,就会触发SETTER函数
set() {}
});
if (a == 1 && a == 2 && a == 3) {
console.log('OK');
}
结语
如果喜欢笔者的文章,可以给我点个赞鼓励一下!!!持续更新前端优质内容