(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;
var ᅠ1 = a;
var ᅠ2 = a;
var ᅠ3 = 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!");
}