1. 序言
其实我们在面试的时候可能会遇到几种经典的面试题,例如上面这种,让我们从其他的角度来实现它
2. 方案1
请看下面的实现方案:
- 请注意这里我们的判断使用了双等于,不是全等于,如果是<==>的话,在if判断的过程中,会自己进行隐式类型转换
- 其实我们就是利用了对象在跟非对象比较的时候,调用toPrimitive, toString等进行隐式转换的机制 ```javascript var a = { i: 0, Symbol.toPrimitive { return ++this.i } }
// 原理:对象跟非对象进行比较的时候,对象首先会调用toPrimitive进行转换,所以可以在这里做手脚 if (a == 1 && a == 2 && a == 3) { console.log(‘相等了’) }
<a name="KzxuJ"></a>
## 3. 方案2
- 请看下面的实现方案:
- 请注意这里我们的判断使用了双等于,不是全等于,如果是<==>的话,在if判断的过程中,会自己进行隐式类型转换
- 如果重写变量的get方法的话,每次调用的时候其实我们是能监听到的,就是利用了这种机制
```javascript
Object.defineProperty(window, 'a', {
get: (() => {
let i = 0
return () => {
return ++i
}
})()
})
// 原理 在全局上定义属性,重写get方法,每次调用的时候都能监听到
if (a == 1 && a == 2 && a == 3) {
console.log('相等了')
}
4. 方案3
- 看下面的代码
- 请注意这里我们的判断使用了双等于,不是全等于,如果是<==>的话,在if判断的过程中,会自己进行隐式类型转换
- 在隐式转换调用toString的时候,我们让他调用数组的shift方法,从头删除,弹出删除的那个 ```javascript var a = [1, 2, 3] a.toString = a.shift
// 其实就是利用toString调用 + shift删除的原则 if (a == 1 && a == 2 && a == 3) { console.log(‘相等了’) }
```