从 a == 1 && a == 2 && a == 3 === true 说起
最近这个问题火了一把,其实最开始我是在 Reddit 看到的,当时也没想到这个问题会火,后来拖稿拖到了现在。
在 StackOverflow 中有几个很有趣的实现形式(中文社区最近不太关心,不知道有没有人已经写过了):
toString()
1const a = {
2 i: 1,
3 toString: function () {
4 return a.i++;
5 }
6}
7
8if(a == 1 && a == 2 && a == 3) {
9 console.log('Hello World!');
10}
11
这一种方法主要利用 a
是对象时比较会调用 toString()
,那么我们自定义 toString()
就能做到结果为 true
的效果了,当然,规则还是不太好记的,与此同时,valueOf
也可以达到相同的效果。
相关阅读:非严格相等 ==
零宽空格
下面一种方法非常的有趣,因为它利用了零宽空格造成了一种视觉上的相等:
1var a= 1;
2var a= 2; //one zero-width character
3var a= 3; //two zero-width characters (or you can use the other one)
4if(a==1&&a==2&&a==3) {
5 console.log("Why hello there!")
6}
7
然而实际上,这并不是三个相同的变量,鉴别的方法是通过 codePointAt
检验 unicode。
关于零宽空格的介绍:https://zh.wikipedia.org/wiki/零宽空格
不同的 a
有了零宽字符的先例,就有人想到有相似的方法:
1var a = 1;
2var a = 2;
3var а = 3;
4if(a == 1 && a == 2 && а == 3) {
5 console.log("Why hello there!")
6}
7
实际上这是三个不同的 a:
- a - Latin lower case A(拉丁小写 a)
- a - Full Width Latin lower case A(全宽拉丁小写 a)
- а - Cyrillic lower case A (另一种字母的小写 a)
( ⊙ o ⊙ )!
我只能说,城里人真会玩,刚开始我只是觉得这样的题目不适合当面试题,适合当段子,万万没想到,是在下输了。
评论 (1)
零宽空格感觉可以来写一些混淆代码,当作加密前端代码