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(‘相等了’) }

  1. <a name="KzxuJ"></a>
  2. ## 3. 方案2
  3. - 请看下面的实现方案:
  4. - 请注意这里我们的判断使用了双等于,不是全等于,如果是<==>的话,在if判断的过程中,会自己进行隐式类型转换
  5. - 如果重写变量的get方法的话,每次调用的时候其实我们是能监听到的,就是利用了这种机制
  6. ```javascript
  7. Object.defineProperty(window, 'a', {
  8. get: (() => {
  9. let i = 0
  10. return () => {
  11. return ++i
  12. }
  13. })()
  14. })
  15. // 原理 在全局上定义属性,重写get方法,每次调用的时候都能监听到
  16. if (a == 1 && a == 2 && a == 3) {
  17. console.log('相等了')
  18. }

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(‘相等了’) }

```