跳到主要内容

(a ==1 && a== 2 && a==3) 能为 true 吗?

· 阅读需 4 分钟

stackoverflow 上看到一道题 Can (a ==1 && a== 2 && a==3) ever evaluate to true?

题目大致是:

if (a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}

解答

这道题稍有点经验,并不难。

主要是单年网易前端微专业有考过 toString 的题目。我被坑过...

答案简单明了:

var a = {
n: 0,
valueOf: function () {
return ++this.n
}
}

if (a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}

当然,用 valueOf toString 都是可以的。

看了下别人的回复,基本上主流都是这个思路,写法稍有不同而已。

其他的解法

对象法

var val = 0;
Object.defineProperty(window, 'a', {
get: function () {
return ++val;
}
});
if (a == 1 && a == 2 && a == 3) {
console.log('yay');
}

和上面一样,也很容易想到,尤其是现在 MVVM 框架遍地开花的时代,就是书写量感觉有点大...还有个我自认为经常拼错的单词。

还有一种 ES6 的写法,这个我没在全局 window 上用过,没想到用 with 处理,所以也很喜欢:

var i = 0;

with ({
get a() {
return ++i;
}
}) {
if (a == 1 && a == 2 && a == 3)
console.log("wohoo");
}

数组法

a = [1, 2, 3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);

方法清新,只不过是不用字符串和对象实现了,换成了数组。其实思路也是大同小异,不过很有创意。

编码法

以下方案,都是编码障眼法

我自认为这个是最流氓的写法:

var aᅠ = 1;
var a = 2;
var ᅠa = 3;
if (aᅠ == 1 && a == 2 && ᅠa == 3) {
console.log("Why hello there!")
}

简言之,你看着是一个变量 a,其实是三个变量,就是编码不同而已,长得和 a 一样。

虽然我知道这种写法,但是自己不会写...具体可以看 SOF 上的解答,因为我觉得没用,所以也不打算去了解学习。

你以为这么写就完了?还有更变态的:

var a = 1;
var1 = a;
var2 = a;
var3 = a;
console.log(a ==1 && a ==2 && a ==3);

山不转水转,数字正常来讲是不能当作变量名字的,但是...你懂的...

如果到这里就算完了,那怎么行?

var a = 9;

if(a == 1 && a == 2 && a == 3)
{
document.write("<h1>Yes, it is possible!😎</h1>")
}

function if() {
return true;
}

流氓耍到底...看到这个解法时候,我真的是...😂

这个一样,是特殊的字符 if,否则正常是不让重写保留词汇的...

由于 js 不能操作双等号,所以就不粘贴了。如果是 Ruby,竟然还可以定义双等号...

最完美答案

这个答案我认为是最完美的,可惜 SOF 赞同只有几十票...可惜了。

a = 100000000000000000
if (a == a + 1 && a == a + 2 && a == a + 3) {
console.log("Precision loss!");
}