假如:a===1 && a===2 && a===3; 那么 a 是什么?

3,139 阅读2分钟

前言

文章提供视频版啦,点击直接查看

hello,大家好,我是 sunday

今天遇到了一个非常有意思的问题,跟大家分享一下。

咱们来看这段代码:

a===1 && a===2 && a===3 

假设上面的表达式成立,那么问:a 是什么?

正文

ok,我们来说一下这个问题的解答。

想要解决这个问题,那么我们首先要知道 JavaScript 中的类型转换和比较运算符的优先级。

JavaScript 中,表达式的运算顺序是 从左到右。因此,在这个表达式中,先执行 a===1 的比较运算符,如果它返回 false,整个表达式就会返回 false,也就是逻辑中断。

如果 a 的值是 1,则比较运算符返回 true,那么就会继续执行下一个逻辑运算符 &&,接着执行 a===2 的比较运算符,如果它返回 false,则整个表达式返回 false,逻辑中断。

以此类推,以此类推,所以 a 的值应该是动态变化的,并且应该依次为 1、2、3。只有这样才会出现 a===1 && a===2 && a===3; 返回 true 的情况。

那么 如何让 a 的值动态变化,就是咱们解决这个问题的关键。

我们在 一小时读完《JavaScript权威指南(第7版)》上一小时读完《深入理解现代 JavaScript》,彻底掌握 ES6 之后 JavaScript 新特性! 中都讲到过,对象的方法存在 get 标记,一旦方法存在 get 标记,那么我们就可以像调用对象的属性一样,调用这个方法。

那么说到这里,肯定很多小伙伴都想到这个问题怎么解决了。

我们直接来看代码:

 const obj = {
      // get 标记
      get a() {
        this.value = this.value || 1;
        return this.value++;
      }
    };
    ​
    console.log(obj.a === 1 && obj.a === 2 && obj.a === 3); // true

在这段代码中,我们创建了一个对象 obj,它包含一个被 get 标记的方法 a。那么此时只要执行 obj.a 就会调用 a 方法,完成 value 自增的操作。从而得到咱们期望的结果。

总结

这是一个非常有意思的问题。除了上面这种方案之后,还有很多其他的实现方案。大家可以开动脑筋,想一想别的方案都有什么呢?

答案留在评论区,咱们一起来讨论下哦~~~