CodeSky 代码之空

随手记录自己的学习过程

从 a == 1 && a == 2 && a == 3 === true 说起

2018-02-02 14:55分类: JavaScript评论: 1

最近这个问题火了一把,其实最开始我是在 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)

鬼柒2018年3月7日 14:56

零宽空格感觉可以来写一些混淆代码,当作加密前端代码