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