如何实现 (a == 1 && a == 2 && a == 3) === true ? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
LeungJZ
V2EX    Javascript

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

  •  
  •   LeungJZ 2018-01-23 10:23:59 +08:00 8652 次点击
    这是一个创建于 2873 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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#

    33 条回复    2018-01-24 13:48:41 +08:00
    mengyaoss77
        1
    mengyaoss77  
       2018-01-23 10:32:31 +08:00   2
    为什么要和自己过不去。。。
    FarAhead
        2
    FarAhead  
       2018-01-23 10:35:43 +08:00
    ```Javascript
    var a = 9;

    if (a==1 && a== 2 && a==3)
    {
    document.write("<h1>Yes, it is possible!</h1>")
    }

    //--------------------------------------------

    function if (){return true;}
    ```
    这个搞笑
    LeungJZ
        3
    LeungJZ  
    OP
       2018-01-23 10:47:03 +08:00
    @w7938940
    然而我这边报错了。
    yutou527
        4
    yutou527  
       2018-01-23 10:47:11 +08:00
    @w7938940 关键字 兄弟
    mdluo
        5
    mdluo  
       2018-01-23 10:48:35 +08:00   1
    宽松相等 ECMAScript 就是这么定义的,没什么好奇怪的

    ECMAScript 标准原文: http://www.ecma-international.org/ecma-262/5.1/#sec-11.9

    之前回答过的一个问题: https://www.zhihu.com/question/46943112/answer/122096589
    mcfog
        6
    mcfog  
       2018-01-23 10:55:44 +08:00
    还有 (a === 1 && a === 2 && a === 3) 也不是不行呢
    attackonFourier
        7
    attackonFourier  
       2018-01-23 11:06:16 +08:00
    var i=0;
    var a = {
    valueOf:()=>[1,2,3][i++]
    }
    a==1 && a==2 && a==3 //true
    ranleng
        8
    ranleng  
       2018-01-23 11:09:41 +08:00
    我那天 Google 推送给我的链接 讲的就是 (a == 1 && a == 2 && a == 3) === true

    const a = {
    num :0,
    valueOf: function(){
    return this.num += 1
    }
    }

    console.log(a == 1 && a == 2 && a == 3)
    woodensail
        9
    woodensail  
       2018-01-23 11:14:16 +08:00
    Object.defineProperty(window,'a',{get(){window._a=window._a||0;return ++window._a}});
    lihongjie0209
        10
    lihongjie0209  
       2018-01-23 11:18:17 +08:00
    jser 玩的开心就好
    ZhLTE
        11
    ZhLTE  
       2018-01-23 11:19:49 +08:00
    第二个能打印出来吗 为啥。。
    ZhLTE
        12
    ZhLTE  
       2018-01-23 11:24:27 +08:00
    @ZhLTE #11 看了原帖 明白了。。但是觉得这不是特性而是 bug
    silov
        13
    silov  
       2018-01-23 12:48:41 +08:00
    最好的语言 PHP,让 $a = TRUE; 就行了。。。
    azh7138m
        14
    azh7138m  
       2018-01-23 12:53:39 +08:00 via Android
    @ranleng valueOf 修改对象,你要觉得这操作没问题,那我无话可说
    hazyzh
        15
    hazyzh  
       2018-01-23 13:07:46 +08:00
    @ZhLTE 哈哈 三胞胎长得像而已
    jsdfzongkai
        16
    jsdfzongkai  
       2018-01-23 13:14:15 +08:00
    @LeungJZ 其实很简单,这三个 a 不是一个 a,你可以试试英语 a 跟俄语 a
    ranleng
        17
    ranleng  
       2018-01-23 13:20:27 +08:00
    @azh7138m 其实不是很懂 js. 这个是上次 Google 推送给我的文章里的代码..
    notreami
        18
    notreami  
       2018-01-23 13:24:37 +08:00
    Java 笑而无语。
    w3sy
        19
    w3sy  
       2018-01-23 13:52:58 +08:00
    很正常的东西,非要找别扭 JS 拦不住你
    Jefftam
        20
    Jefftam  
       2018-01-23 14:03:41 +08:00
    @w7938940 一看就是错误的写法..还笑...
    AV1
        21
    AV1  
       2018-01-23 15:39:17 +08:00
    @w7938940 你把 if 写成 If 还能糊弄一下
    FarAhead
        22
    FarAhead  
       2018-01-23 16:36:28 +08:00
    @LeungJZ
    @yutou527
    @Jefftam
    @DOLLOR
    你们没看楼主贴的 stackoverflow 原帖吗,这是其中一个答案,定义的 if 方法有一个隐藏的字符,只不过网页没有显示出来,我复制粘贴过来貌似就失效了,可以去原帖里复制运行试试
    yuanji
        23
    yuanji  
       2018-01-23 16:38:17 +08:00
    zodiac1111
        24
    zodiac1111  
       2018-01-23 16:50:00 +08:00
    (a==a) ===false


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

    答案在这里:


    chenstack
        27
    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
        28
    wuethan  
       2018-01-23 23:36:57 +08:00
    都好闲
    lmqdlr
        29
    lmqdlr  
       2018-01-24 00:26:36 +08:00 via Android
    那个,还记得大明湖畔的 True, False = False, True 吗
    Jefftam
        30
    Jefftam  
       2018-01-24 02:17:07 +08:00
    @LeungJZ 哈哈,科普一下这个字符 Unicode Character 'ZERO WIDTH NON-JOINER' (U+200C)
    lzvezr
        31
    lzvezr  
       2018-01-24 07:04:32 +08:00 via iPhone
    因为重写了方法,而且用到了类型转换所以很正常
    如果重写了 get 方法(a === 1 && a === 2 && a === 3)也可以的
    看到楼上提到 Unicode 字符才是坑的,比如 ''.length === 2
    exonuclease
        32
    exonuclease  
       2018-01-24 09:42:49 +08:00 via Android
    定义 getter 或者用 proxy 什么的反正一堆办法
    120267583
        33
    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
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5119 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 07:47 PVG 15:47 LAX 23:47 JFK 02:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86