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 · 7836 次点击
    这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    为什么要和自己过不去。。。
    w7938940
        2
    w7938940  
       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 一看就是错误的写法..还笑...
    DOLLOR
        21
    DOLLOR  
       2018-01-23 15:39:17 +08:00
    @w7938940 你把 if 写成 If 还能糊弄一下
    w7938940
        22
    w7938940  
       2018-01-23 16:36:28 +08:00
    @LeungJZ
    @yutou527
    @Jefftam
    @DOLLOR
    你们没看楼主贴的 stackoverflow 原帖吗,这是其中一个答案,定义的 if 方法有一个隐藏的字符,只不过网页没有显示出来,我复制粘贴过来貌似就失效了,可以去原帖里复制运行试试
    jyjmrlk
        23
    jyjmrlk  
       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   ·   我们的愿景   ·   实用小工具   ·   2700 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:36 · PVG 23:36 · LAX 08:36 · JFK 11:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.