一道关于类型转换的面试题的研究

题目

如下代码展示,当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。

如果你有更好的方案,请在下方留言讨论

posted @ 2020-10-28 16:18  爱喝可乐的靓仔  阅读(88)  评论(0编辑  收藏  举报