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


    题目

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

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

  • 相关阅读:
    华硕笔记本无法U盘启动,快捷键识别不了
    怎么将uefi改成legacy启动|BIOS设置legacy引导模式的方法
    [CDLinux]制作U盘CDLinux系统启动盘
    重装系统时,将MBR分区转为GPT 分区
    5-Comments
    4-HTML Computer Code Elements
    3-html 缩写-地址-文字方向-引用块-题注的格式
    2-HTML Text Formatting Elements
    1-HTML Attributes
    LabVIEW--为设备添加配置文件.ini
  • 原文地址:https://www.cnblogs.com/loveliang/p/13891728.html
Copyright © 2020-2023  润新知