JS 真是门神奇的语言 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
jason19659

JS 真是门神奇的语言

  •  
  •   jason19659
    jason19659 Dec 14, 2017 8217 views
    This topic created in 3081 days ago, the information mentioned may be changed or developed.
    [] == ![]
    true

    这样都行的吗
    Supplement 1    Dec 14, 2017
    现在看来

    ```
    [] == false
    true
    [] == []
    false
    [] != []
    true

    ```
    Supplement 2    Dec 14, 2017
    新问题来了,如楼下回帖

    ```
    [] == false
    true

    if([]) {console.info(true)} else {console.info(false)}
    true

    ```
    这又是什么情况
    42 replies    2017-12-16 18:50:55 +08:00
    vincenttone
        1
    vincenttone  
       Dec 14, 2017
    [] == false
    Smilecc
        2
    Smilecc  
       Dec 14, 2017
    [] === ![]
    mentalidade
        3
    mentalidade  
       Dec 14, 2017
    难道比较的是两个数组的地址?
    vincenttone
        4
    vincenttone  
       Dec 14, 2017
    [] == false
    ![] == false
    !false == true

    应该是弱类型导致的?
    mooncakejs
        5
    mooncakejs  
       Dec 14, 2017
    准备战争:来 show 出你常用的语言,我们来找奇葩点。
    nannanziyu
        6
    nannanziyu  
       Dec 14, 2017
    @mooncakejs
    额,汉语?
    vincenttone
        7
    vincenttone  
       Dec 14, 2017
    ![] === false
    [] == false

    [] === false // false

    应该是弱类型导致的吧
    ZxBing0066
        8
    ZxBing0066  
       Dec 14, 2017
    ...并不觉得有什么槽点 毕竟现实谁也不会写这种代码
    mooncakejs
        9
    mooncakejs  
       Dec 14, 2017
    @nannanziyu 我只负责引战,不负责战斗。
    littlepanzh
        10
    littlepanzh  
       Dec 14, 2017
    如果知道什么是 primitive value 就不会觉得奇葩了
    大多数觉得奇葩的事情其实都是了解的不够导致的~
    Pastsong
        11
    Pastsong  
       Dec 14, 2017 via Android
    这是 ECMA262 标准的实现
    zywsss
        12
    zywsss  
       Dec 14, 2017   3
    左侧的[]是一个对象,js 中对象都是为 true
    右侧的![],其中的!会将右侧的[]转为 boolean 并取反,js 中数组只有 toString 方法进行类型转换,[]就转为了空字符串''为 false,一取反为 true
    599316527
        13
    599316527  
       Dec 14, 2017   7
    https://pbs.twimg.com/media/DM1czpAXkAAH8qF.jpg

    看过哈哈哈就好了,真的干活谁要敢这么写就是找死
    lovedebug
        14
    lovedebug  
       Dec 14, 2017
    1. [] == false
    2. "" == 0
    3. 0 == 0
    leemove
        15
    leemove  
       Dec 14, 2017
    所以我们用===
    bramblex
        16
    bramblex  
       Dec 14, 2017
    typescript 大法好
    SourceMan
        17
    SourceMan  
       Dec 14, 2017
    没毛病啊,这是语言特性,不能用强类型语言的逻辑来审视 JS 这种弱类型语言
    == 是不推荐使用的比较方式,ESLint 要强制 ===
    当然,可以用 TS 写,更加 666
    isbase
        18
    isbase  
    PRO
       Dec 14, 2017
    Boolean([].valueOf().toString()) == ![]
    k9982874
        20
    k9982874  
       Dec 14, 2017
    [] 因数组长度为 0 返回 false
    ![] "[]"是有效对象转成 boolean 值 true,再非运算,所以返回 false
    false == false 结果是 true

    觉得神奇还是因为熟练度不够,继续练级吧。
    wxsm
        21
    wxsm  
       Dec 14, 2017
    你觉得这个结果很“神奇”,只是因为你对它的了解还不够而已。
    yasumoto
        22
    yasumoto  
       Dec 14, 2017
    [] !== [] 也是等于 true
    finian
        23
    finian  
       Dec 14, 2017
    @zywsss @k9982874 别瞎猜,看看人家 Spec 是怎么定义的:

    > http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

    ```
    [] == ![]
    => [] == false // ![]
    => [] == 0 // [] == ToNumber(false)
    => '' == 0 // ToPrimitive([]) == 0
    => 0 == 0 // ToNumber('') == 0
    => true
    ```
    v2lf
        24
    v2lf  
       Dec 14, 2017
    是时候拿出来我珍藏的网页啦, 虽然规范最好,但是有人不喜欢看,所以 ,
    看下这个。

    [see me]( https://Javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-Javascript/)
    uolcano
        25
    uolcano  
       Dec 14, 2017 via Android
    一个建议,有时间多看看 ECMAScript 标准文档吧
    AV1
        26
    AV1  
       Dec 14, 2017   1
    可以参考: https://Javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-Javascript/
    很复杂,是嘛?为何不直接用===和!==呢?
    对 JS 不求甚解,却热衷奇技淫巧,就像某些 C 语言初学者争吵 i+++++i 的结果一样毫无意义。
    noviceiOS
        27
    noviceiOS  
       Dec 14, 2017
    @zywsss 那为什么

    [] == ![] true

    {} == !{} false
    Tompes
        28
    Tompes  
       Dec 14, 2017
    是时候掏出 JS 真值表了。 [滑稽
    zywsss
        29
    zywsss  
       Dec 14, 2017
    @finian 他这个应该是对的

    [] == ![]

    !优先级比==高,所以先执行![],将[]转为 bool 并取反,[]空数组也是对象,对象为 true,取反结果为 false
    [] == false 左侧是对象,右侧是 bool,类型不一样,转为数字进行比较
    [] == 0
    左侧空数组要转为数字,数组转为 primitive 只有 toString,结果就是空字符''
    '' == 0 左右类型还是不一样,转为数字比较

    0 == 0 结果 true
    jason19659
        30
    jason19659  
    OP
       Dec 14, 2017
    @finian #26 不对啊,那为什么
    ```
    [] == []
    false
    [] != []
    true
    ```
    LeungJZ
        31
    LeungJZ  
       Dec 14, 2017
    if ([]) console.log('a')
    else console.log('b')

    输出 a 你会怀疑人生了。
    ivechan
        32
    ivechan  
       Dec 14, 2017
    “ The World's Most Misunderstood Programming Language ”
    这篇文章也不是现在才有的了, 但是这不影响 Javascript 是个成功的语言, 是值得学习的。
    值不值得你爱,就因人而异了。
    jason19659
        33
    jason19659  
    OP
       Dec 14, 2017
    @ivechan #34 不管你爱不爱。。但你都得用。。
    janxin
        34
    janxin  
       Dec 14, 2017
    不会背真值表你怎么用 JS ?
    zywsss
        35
    zywsss  
       Dec 14, 2017
    @jason19659 []数组是对象,左右两边是两个独立的对象
    Terry05
        36
    Terry05  
       Dec 14, 2017
    写 js 要习惯于使用 === 不然会有很多自己意想不到的坑!
    timothyqiu
        38
    timothyqiu  
       Dec 14, 2017
    bucky
        39
    bucky  
       Dec 14, 2017
    一个语言的设计缺陷常常被用来当面试题,真不明白这些人怎么想的
    SimbaPeng
        40
    SimbaPeng  
       Dec 15, 2017
    @bucky 不仅要当面试题,还要被脑残粉美其名曰:feature, 2333333
    sunber
        41
    sunber  
       Dec 15, 2017
    如果碰到这类面试题,走为上策
    Kobayashi
        42
    Kobayashi  
       Dec 16, 2017 via Android
    正在读 Javascript 高级程序设计:

    p44 逻辑非,第一条,对象的逻辑非为 false ;
    p51 相等和不等,第一条,存在布尔值时的相等比较,比较二者数值;第七条,两个对象比较,比较是不是同一个对象。

    此题完。
    About     Help     Advertise     Blog     API     FAQ     Solana     1154 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 94ms UTC 23:38 PVG 07:38 LAX 16:38 JFK 19:38
    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