在javascript中,如何让a == 1 && a == 2 && a == 3为true?

代码都是手写,如有错误,敬请原谅

题目大概是这样的

1
2
3
4
5
6
7
8
请问以下程序的输出结果

var a = Number('1')
if (a == 1 && a == 2 && a == 3) {
  console.log('yes')
} else {
  console.log('no')
}

你看到这个题目的第一反应是什么?你一定会想:这么简单,是不是有什么坑?

当时我的第一反应是:这还用说吗?肯定是no啊,这出题的人莫不是个傻子吧?🤔

Too young too simple,请看第二问:

1
如果输出为 no , 请添加代码,使代码输出 yes

一脸懵逼 😨, 还有这种操作?

搞懂之后,问题就不再是问题。

某种答案的写法

1
2
3
4
5
6
7
8
9
10
11
12
var a = new Number("1");
a.valueOf = (function() {
  var _a = 1;
  return function() {
    return _a++;
  };
})();
if (a == 1 && a == 2 && a == 3) {
  console.log("yes");
} else {
  console.log("no");
}

这个题目主要是考察了javascript的基础:

  • 数据类型
  • 隐式类型转换

另外一种思路

另外一种思路也可以解决此问题,那就是 Object.defineProperty ,不过这种方式只适用于全局,作用域内的就会有点问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Object.defineProperty(window, "a", {
  get: (function() {
    let _i = 1;
    return function() {
      return _i++;
    };
  })()
});

if (a == 1 && a == 2 && a == 3) {
  console.log("yes");
} else {
  console.log("no");
}

坊间传言javascript是一门先使用后学习的语言,很多东西我们都不曾深究。任何一门语言,我们应该追根溯源,这样才能有更好的理解。

结论: 轻易觉得别人是傻子的人,自己就是傻子