又想起了一个黑 js 的故事,困扰好久了。。当初就没有解答 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
jason19659
V2EX    Javascript

又想起了一个黑 js 的故事,困扰好久了。。当初就没有解答

  •  
  •   jason19659 2018-07-30 22:57:43 +08:00 5841 次点击
    这是一个创建于 2635 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先我们输入 [] == true //false
    也就是[] == false // true
    这个很好理解。。。
    然后我们继续 if([]) {1} else {2}
    从上面可知[]是 false 那么应该打印 2
    然后控制台打印了 1.。。。

    到底 TMD 是为什么为什么为什么为什么为什么啊啊啊啊啊啊啊!!!!

    17 条回复    2018-08-17 13:46:15 +08:00
    jugelizi
        1
    jugelizi  
       2018-07-30 23:01:26 +08:00
    []!=[] // true
    Zzdex
        2
    Zzdex  
       2018-07-30 23:01:34 +08:00
    [] == ![] //true

    :doge
    remon
        3
    remon  
       2018-07-30 23:10:53 +08:00 via Android   5
    一个是比较,[] == false 最后变成了 0 == 0,当然是 true 了,而 if 里面是转成 boolean,[]转成 boolean 就是 true,没毛病
    darkkylin
        4
    darkkylin  
       2018-07-30 23:14:36 +08:00   1
    1、隐式类型转换
    2、falsy 值:false,null,'',0,NaN,undefined
    3、!![] //true,所以 if ( true ){1}
    jason19659
        5
    jason19659  
    OP
       2018-07-30 23:18:21 +08:00
    @remon #3 布尔比较最后为什么会变成 0 == 0 ? 理论上不是应该在 flse == false 才是最后
    msputup
        6
    msputup  
       2018-07-30 23:18:46 +08:00   1
    JS 比较的时候,会强制转换为 Number。楼主可以试下 Number([])
    而判断的时候。会强制转换为 Boolean。

    楼主可以试下这个题。

    {}+[]===0 //true
    []+{}===0 //false
    console.log({}+[]===0) //false
    jason19659
        7
    jason19659  
    OP
       2018-07-30 23:22:44 +08:00
    @msputup #6 也就是 == 和 if 的逻辑不是统一的??两个人写的还是有什么原因?。。。
    msputup
        8
    msputup  
       2018-07-30 23:23:29 +08:00
    @jason19659 不清楚,自己了解就好了
    shintendo
        9
    shintendo  
       2018-07-30 23:32:03 +08:00   1
    [] 是对象,只要记得所有对象都是 truthy 的就行了,包括 new Boolean(false)也是 truthy 的。
    你的例子所有的问题只是在于==符号的诡异行为,这也是为什么它是 bad parts,当这个符号不存在就好了。
    remon
        10
    remon  
       2018-07-30 23:43:24 +08:00 via Android
    @msputup 这两个确实是不一样的,if 是直接转成 boolean 毫无问题,== 的判断比较不符合直觉,具体规则你可以看一下资料
    beny2mor
        11
    beny2mor  
       2018-07-30 23:43:54 +08:00
    因为你没有使用===
    [] ===false
    chemzqm
        12
    chemzqm  
       2018-07-30 23:45:40 +08:00
    eslint 把 == 禁掉吧,这个除了用在 == null 判定 null 或者 undefined 情况,其它时候是很容易 bug 的。
    rabbbit
        13
    rabbbit  
       2018-07-30 23:59:55 +08:00   1
    if 操作调用 ToBoolean(GetValue(exprRef)) ,所有 Object 都返回 true
    https://es5.github.io/#x12.5

    [] == true
    1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(y)
    2 因为 Type([])为 Object, 返回 ToPrimitive(x) == ToNumber(y)
    ToPrimitive 通过调用[[DefaultValue]] ,返回对象的默认值(就是分别调用 toString valueOf)
    https://es5.github.io/#x11.9.3
    rabbbit
        14
    rabbbit  
       2018-07-31 00:06:42 +08:00
    更正
    1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(true)
    2 因为 Type([])为 Object, 返回 ToPrimitive([]) == ToNumber(true)
    mingyun
        15
    mingyun  
       2018-07-31 00:23:25 +08:00
    zhzer
        16
    zhzer  
       2018-07-31 09:22:15 +08:00
    new Array() == false // true
    new Object() == false // false

    [0] == false // true
    [1] == false // false

    ![] == !![] // true
    ![] == [] // true
    ![] == !!![] // false

    简单说叫做特性...用恒等就完事了
    codevvvv9
        17
    codevvvv9  
       2018-08-17 13:46:15 +08:00
    if([]) {1} else {2}
    1、 []这是一个对象,都属于 truthy 值。
    2、只有 null、undefined、0、''、NaN、false 五个 falsey 值。
    所以很明显打印 1,不要相信== ,一直用===就好啦
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1040 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:34 PVG 02:34 LAX 11:34 JFK 14:34
    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