从 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 ⊙ )!

我只能说,城里人真会玩,刚开始我只是觉得这样的题目不适合当面试题,适合当段子,万万没想到,是在下输了。

如果您觉得文章不错,可以通过赞助支持我

标签: 知识, 语法

仅有一条评论

  1. 鬼柒

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

添加新评论