题目
如下代码展示,当a为什么的时候?条件成立并打印console!!
var a = ????
if(a==1 && a==2 &&a==3){
console.log('ok')
}
第一眼看到的时候,‘什么鬼啊,是不是’,a怎么可能同时等于三个值呢。
但是我们往深处想一想,不是有类型转换的嘛,仔细一看,是两个==号,说不并不需要判断类型也一致。
再想一下,转换成Number类型,数组,对象,是不是有点思路了。
下面提供第一种解决方案,利用对象来做,先看代码
var a = {
i:0,
toString(){
return ++this.i
}
}
if(a==1 && a==2 &&a==3){
console.log('ok')
}
神奇的事情发生了,这段代码就会输出ok。为什么呢?
我们给对象a写一个toString方法,当去调用的时候就是我们写的这个方法,而不是去原型上去找toString方法。
每次判断的时候去调用一次,刚好每次都成功。
刚刚我们提到了数组,现在我们来提供第二种方法来解决。
看代码
var a = [1, 2, 3]
a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
console.log('ok111')
}
是不是看起来 简便了很多, 我们理一下。
首先定义一个数组,包含 1 ,2 ,3 。
shift是数组的方法,删除数组的第一项,返回值是删除的那一项(是不是瞬间明白了些什么)
走判断条件的时候,每一次删除第一个并转换为字符串,字符串数字和number数字是相等的,
所以数组的方式也可以输出ok。
哈,还有可以通过数组劫持的方法来实现,先来看代码
var i = 0;
Object.defineProperty(window, 'a', {
get() {
return ++i;
}
});
if (a == 1 && a == 2 && a == 3) {
console.log('ok222')
}
Object.defineProperty可以检测到各个属性的变化,如果window不存在这个属性,会新建一个属性。
我们写的这个代码就是在window上检测a属性,get是获取,走判断条件时,每走一次就会走一遍检测属性a的代码
每次++i就可以吧值赋值给a,这个进行判断的时候就会相等,条件成立,输出ok。
如果你有更好的方案,请在下方留言讨论