推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
LeungJZ

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

  •  
  •   LeungJZ · Jan 23, 2018 · 9408 views
    This topic created in 3212 days ago, the information mentioned may be changed or developed.

    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 replies  •  2018-01-24 13:48:41 +08:00
    mengyaoss77
    mengyaoss77
    Jan 23, 2018❤️2
    1
    为什么要和自己过不去。。。
    FarAhead
    FarAhead
    Jan 23, 2018
    2
    ```javascript
    var a = 9;

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

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

    function if ‌(){return true;}
    ```
    这个搞笑
    LeungJZ
    LeungJZ
    OP
    Jan 23, 2018
    3
    @w7938940
    然而我这边报错了。
    yutou527
    yutou527
    Jan 23, 2018
    4
    @w7938940 关键字 兄弟
    mdluo
    mdluo
    Jan 23, 2018❤️1
    5
    宽松相等 ECMAScript 就是这么定义的,没什么好奇怪的

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

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


    var a=NaN
    yutou527
    yutou527
    Jan 23, 2018
    25
    @w7938940 好吧,没点进去
    LeungJZ
    LeungJZ
    OP
    Jan 23, 2018❤️1
    26
    @yutou527
    @Jefftam
    @DOLLOR
    @w7938940

    答案在这里:


    chenstack
    chenstack
    Jan 23, 2018
    27
    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
    wuethan
    Jan 23, 2018
    28
    都好闲
    lmqdlr
    lmqdlr
    Jan 24, 2018 via Android
    29
    那个,还记得大明湖畔的 True, False = False, True 吗
    Jefftam
    Jefftam
    Jan 24, 2018
    30
    @LeungJZ 哈哈,科普一下这个字符 Unicode Character 'ZERO WIDTH NON-JOINER' (U+200C)
    lzvezr
    lzvezr
    Jan 24, 2018 via iPhone
    31
    因为重写了方法,而且用到了类型转换所以很正常
    如果重写了 get 方法(a === 1 && a === 2 && a === 3)也可以的
    看到楼上提到 Unicode 字符才是坑的,比如 '😂'.length === 2
    exonuclease
    exonuclease
    Jan 24, 2018 via Android
    32
    定义 getter 或者用 proxy 什么的反正一堆办法
    120267583
    120267583
    Jan 24, 2018
    33
    a = [1,2,3];
    a.join = a.shift;
    console.log(a == 1 && a == 2 && a == 3);

    数组 a 被比较的时候会先调用 toString,toString 里面会调用 join
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1541 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 16:27 · PVG 00:27 · LAX 08:27 · JFK 11:27
    ♥ Do have faith in what you're doing.