经典面试题系列(3):使var a= ? 时,a == 1 && a == 2 && a==3成立的两种实现思路

707 阅读1分钟

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');
}

结语

如果喜欢笔者的文章,可以给我点个赞鼓励一下!!!持续更新前端优质内容