最近无意间看到一个有趣的帖子:
- 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
尾声
写这篇文章其实并不是为了去深挖这些语言特性, 只是单纯地觉得很有意思.
如果从这个题目本身出发, 它既可以考察解题者的语言特性掌握程度; 也可以考察出解题者对待问题, 尝试解决问题的方法论. 学习这条路上, 任重而道远..
来源: http://www.jianshu.com/p/0acf846c2210