首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
华为云
V2EX  ›  JavaScript

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

  •  
  •   LeungJZ · 206 天前 · 4676 次点击
    这是一个创建于 206 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
        1
    mengyaoss77   206 天前   ♥ 2
    为什么要和自己过不去。。。
        2
    w7938940   206 天前
    ```javascript
    var a = 9;

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

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

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

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

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


    var a=NaN
        25
    yutou527   205 天前
    @w7938940 好吧,没点进去
        26
    LeungJZ   205 天前   ♥ 1
    @yutou527
    @Jefftam
    @DOLLOR
    @w7938940

    答案在这里:


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

    这里三个是不同的变量,第一个和第三个 a 前后的空白字符不是空格,Unicode FFA0
        28
    wuethan   205 天前
    都好闲
        29
    lmqdlr   205 天前 via Android
    那个,还记得大明湖畔的 True, False = False, True 吗
        30
    Jefftam   205 天前
    @LeungJZ 哈哈,科普一下这个字符 Unicode Character 'ZERO WIDTH NON-JOINER' (U+200C)
        31
    lzvezr   205 天前 via iPhone
    因为重写了方法,而且用到了类型转换所以很正常
    如果重写了 get 方法(a === 1 && a === 2 && a === 3)也可以的
    看到楼上提到 Unicode 字符才是坑的,比如 '😂'.length === 2
        32
    exonuclease   205 天前 via Android
    定义 getter 或者用 proxy 什么的反正一堆办法
        33
    120267583   204 天前
    a = [1,2,3];
    a.join = a.shift;
    console.log(a == 1 && a == 2 && a == 3);

    数组 a 被比较的时候会先调用 toString,toString 里面会调用 join
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   实用小工具   ·   3111 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 18ms · UTC 03:09 · PVG 11:09 · LAX 20:09 · JFK 23:09
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1