如何实现 (a == 1 && a == 2 && a == 3) === true ?

2018-01-23 10:23:59 +08:00
 LeungJZ

js 真是门强 ke 大 pa 的语言。

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

toString 可以修改为 valueOf,如果两个都写,只会调用 valueOf。

var a ᅠ = 1;
var a = 2;
var ᅠ a = 3;
if(a ᅠ==1 && a== 2 &&ᅠ a==3) {
    console.log("Why hello there!")
}

这个感觉就莫名其妙的了。。。

a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);

这个其实原理和第一个一样,比较前先进行转换。

let a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)};

console.log(a == 1 && a == 2 && a == 3);

emmm... symbol 还没学。

这个问题真的是太可怕了,问出来估计真的没多少人能答得出来。

传送门: https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true#

7889 次点击
所在节点    JavaScript
33 条回复
DOLLOR
2018-01-23 15:39:17 +08:00
@w7938940 你把 if 写成 If 还能糊弄一下
w7938940
2018-01-23 16:36:28 +08:00
@LeungJZ
@yutou527
@Jefftam
@DOLLOR
你们没看楼主贴的 stackoverflow 原帖吗,这是其中一个答案,定义的 if 方法有一个隐藏的字符,只不过网页没有显示出来,我复制粘贴过来貌似就失效了,可以去原帖里复制运行试试
jyjmrlk
2018-01-23 16:38:17 +08:00
zodiac1111
2018-01-23 16:50:00 +08:00
(a==a) ===false


var a=NaN
yutou527
2018-01-23 17:56:54 +08:00
@w7938940 好吧,没点进去
LeungJZ
2018-01-23 18:19:01 +08:00
@yutou527
@Jefftam
@DOLLOR
@w7938940

答案在这里:


chenstack
2018-01-23 20:21:20 +08:00
var ᅠ a = 1;
var a = 2;
var a ᅠ = 3;
if(ᅠ a == 1 && a == 2 && a ᅠ== 3 ) {
console.log("Why hello there!")
}

这里三个是不同的变量,第一个和第三个 a 前后的空白字符不是空格,Unicode FFA0
wuethan
2018-01-23 23:36:57 +08:00
都好闲
lmqdlr
2018-01-24 00:26:36 +08:00
那个,还记得大明湖畔的 True, False = False, True 吗
Jefftam
2018-01-24 02:17:07 +08:00
@LeungJZ 哈哈,科普一下这个字符 Unicode Character 'ZERO WIDTH NON-JOINER' (U+200C)
lzvezr
2018-01-24 07:04:32 +08:00
因为重写了方法,而且用到了类型转换所以很正常
如果重写了 get 方法(a === 1 && a === 2 && a === 3)也可以的
看到楼上提到 Unicode 字符才是坑的,比如 '😂'.length === 2
exonuclease
2018-01-24 09:42:49 +08:00
定义 getter 或者用 proxy 什么的反正一堆办法
120267583
2018-01-24 13:48:41 +08:00
a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);

数组 a 被比较的时候会先调用 toString,toString 里面会调用 join

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/425127

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX