if(a==1 && a==2 && a==3) 结果为 true,怎么做到的?打破你的认知!

简介: 这是一个JS社区抛出来的问题。第一眼看到这个问题的时候,感觉这似乎是一个无稽之谈,一个变量怎么可能会同时满足俩个条件呢!不过后来深入思考一下,发现这类问题有点意思...

前言

最近无意间看到一个有趣的帖子:

var a = ???;
if(a == 1 && a == 12){  
  console.log(a);
}

这是一个JS社区抛出来的问题。第一眼看到这个问题的时候,感觉这似乎是一个无稽之谈,一个变量怎么可能会同时满足俩个条件呢!


不过后来深入思考一下,发现这类问题有点意思...


如果你也觉得不可能的话,一起随着文章看下去。你也会觉得有点意思~


下文不仅仅涉及的是JS,还有Java等等其他语言~


正文

接下来咱们来尝试解决这个问题。假设 if(a==1&&a==12)是等于 true的,那么a肯定不可能是一个“普通的变量”。它势必要有能力在执行的时候能够动态改动值。


一、JS版本

如果出于这种出发点,我们是不是能够假设:如果能够重新类似a方法的执行方法似乎就能够做到这种结果。


接下来这里贴一种答案:


image.png


看到这个答案,我猜搞Java或其他面向对象语言的同学有些“懵逼”。不过如果仔细看,仔细想其实也是可能从中看出一些解题思路的。


当然可能有JS的小伙伴想要求解答,这里碰巧写过解析,这里就贴出他的文章地址


看了JS的答案,我一直顺着这个解题思路再想:Java中有没有可能完成这个等式?只能说自己“功力太浅”始终没有找到合适的解决方式...因此自己就Google了一下,发现果然有“闲的蛋疼”的人提供了答案,甚至还提供了多种版本:


二、Java版本

这里就直接贴答案了,虽然不能说非常的贴近于题目,但也着实展示了其中的巧妙:

Class cache = Integer.class.getDeclaredClasses()[0];
Field c = cache.getDeclaredField("cache");
c.setAccessible(true);
Integer[] array = (Integer[]) c.get(cache);
// array[129] is 1
array[130] = array[129]; 
// Set 2 to be 1
array[131] = array[129]; 
// Set 3 to be 1
Integer a = 1;
if(a == (Integer)1 && a == (Integer)2 && a == (Integer)3){ 
   System.out.println("Success");
}

另一个答案,说实话比较“牛逼”了:


这里用到了PowerMockRunner,也算是咱们解题思路的上最直接的帮手...


image.png

尾声

写这篇文章其实并不是为了去深挖这些语言特性,只是单纯的觉得很有意思。


如果从这个题目本身出发,它既可以考察解题者的语言特性掌握程度;也可以考察出解题者对待问题,尝试解决问题的方法论。学习这条路上,任重而道远...


相关文章
|
1月前
|
Java
【编程基础知识】《Java 基础探秘:return、break、continue、label、switch 与 enum 的深度解析》
本文深入解析了 Java 中的 return、break、continue、label、switch 和 enum 等基础概念,通过代码示例和流程图,帮助读者理解这些控制结构和枚举类型在编程中的应用,提升编程能力。
25 3
|
4月前
|
JavaScript 前端开发
continue、return、break三者的区别
continue、return、break三者的区别
|
6月前
break,continue,return的区别深度剖析
break,continue,return的区别深度剖析
|
6月前
|
C#
c#一文读懂continue、return、break区别
c#一文读懂continue、return、break区别
52 0
|
6月前
|
Python
BUUCTF [GXYCTF2019]SXMgdGhpcyBiYXNlPw== 1
BUUCTF [GXYCTF2019]SXMgdGhpcyBiYXNlPw== 1
166 1
关于==和equals的区别和联系,面试这么回答就可以
关于==和equals的区别和联系,面试这么回答就可以
Optional 与传统 If 判断的区别
Optional 与传统 If 判断的区别
59 0
return的作用
js中的函数只是实现某种功能,最终的结果需要返回给函数的调用者 函数名( ) 通过return实现的。 只要函数遇到return 就把后面的结果,返回给函数的调用者。 函数名 ( ) = return 后面的结果。
|
前端开发
前端学习案例1-empty和undefined区别
前端学习案例1-empty和undefined区别
85 0
前端学习案例1-empty和undefined区别
经典面试题a == 1 && a== 2 && a== 3
经典面试题a == 1 && a== 2 && a== 3
69 0