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

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

题目大致是:

1
2
3
4
5
// TODO

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

解答

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

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

答案简单明了:

1
2
3
4
5
6
7
8
9
10
var a = {
n: 0,
valueOf: function() {
return ++this.n
}
}

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

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

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

其他的解法

对象法

1
2
3
4
5
6
7
8
9
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 处理,所以也很喜欢:

1
2
3
4
5
6
7
8
9
10
var i = 0;

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

数组法

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

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

编码法

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
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 赞同只有几十票…可惜了。

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