经典大厂面试题: a是什么情况下 条件【a == 1 && a == 2 && a == 3】满足

139 阅读2分钟

在这里我们重复下我们的题目:

var a = ?; 条件【a == 1 && a == 2 && a == 3】满足,我们会从不同的角度解析这个问题,进行深入解析

  • 从对象类型转换角度进行解析 这里为什么将a转换为对象呢。这里需要理解对象的转换规则,下面给大家说下,如果知道的同学可以直接跳过,不知道的可以记住下
    1. 先调用属性Symbol.toPrimitive,如果没有这个属性
    2. 再去调用对象的valueOf函数获取原始值,如果不是原始值
    3. 调用对象的toString()函数进行内容的获取。 我们这里使用Symbol.toPrimitive属性。在每次使用a的时候,根据上面的查找规则,会获取对应的1, 2, 3(因为这里的i每次都是累加的)。所以结果就是true
  • 从数组的shift函数小技巧出发 这里的a我们将它作为一个数组,数组的值就是分别判断的内容。这里就是var a = [1, 2, 3]; 还是上述的查询规则 我们添加属性自身的toString方法,toString方法指向数组的shift方法,所以使用a的时候,都是调用shift方法。会将数组的头一个元素切除返回,所以每次值都是一致的
  • 从数据劫持的角度出发 这里使用数据劫持的方式进行判断。前提是变量a是隐式通过window进行调用的,但是如果是let a 就不能使用了。当我们使用变量a的时候,就会被我们拦截到 同样我们可以使用get方法 返回具体的值 同样是用累加 依次返回1, 2, 3 我们为啥这里使用只执行函数呢。其实使用了闭包的概念,避免外部定义变量。