JS 真是门神奇的语言 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jason19659
V2EX    程序员

JS 真是门神奇的语言

  •  
  •   jason19659
    jason19659 2017-12-14 10:42:51 +08:00 7835 次点击
    这是一个创建于 2865 天前的主题,其中的信息可能已经有所发展或是发生改变。
    [] == ![]
    true

    这样都行的吗
    第 1 条附言    2017-12-14 16:04:36 +08:00
    现在看来

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

    ```
    第 2 条附言    2017-12-14 16:54:29 +08:00
    新问题来了,如楼下回帖

    ```
    [] == false
    true

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

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

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

    [] === false // false

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

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

    觉得神奇还是因为熟练度不够,继续练级吧。
    wxsm
        21
    wxsm  
       2017-12-14 13:14:41 +08:00
    你觉得这个结果很“神奇”,只是因为你对它的了解还不够而已。
    yasumoto
        22
    yasumoto  
       2017-12-14 13:25:51 +08:00
    [] !== [] 也是等于 true
    finian
        23
    finian  
       2017-12-14 13:31:38 +08:00
    @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  
       2017-12-14 13:34:09 +08:00
    是时候拿出来我珍藏的网页啦, 虽然规范最好,但是有人不喜欢看,所以 ,
    看下这个。

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

    [] == ![] true

    {} == !{} false
    Tompes
        28
    Tompes  
       2017-12-14 14:25:13 +08:00
    是时候掏出 JS 真值表了。 [滑稽
    zywsss
        29
    zywsss  
       2017-12-14 15:18:26 +08:00
    @finian 他这个应该是对的

    [] == ![]

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

    0 == 0 结果 true
    jason19659
        30
    jason19659  
    OP
       2017-12-14 16:01:59 +08:00
    @finian #26 不对啊,那为什么
    ```
    [] == []
    false
    [] != []
    true
    ```
    LeungJZ
        31
    LeungJZ  
       2017-12-14 16:12:12 +08:00
    if ([]) console.log('a')
    else console.log('b')

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

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

    此题完。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2529 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 10:54 PVG 18:54 LAX 03:54 JFK 06:54
    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