V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jason19659
V2EX  ›  程序员

JS 真是门神奇的语言

  •  
  •   jason19659 ·
    jason19659 · 2017-12-14 10:42:51 +08:00 · 7196 次点击
    这是一个创建于 2297 天前的主题,其中的信息可能已经有所发展或是发生改变。
    [] == ![]
    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

    看过哈哈哈就好了,真的干活谁要敢这么写就是找死
    lovedebug
        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 标准文档吧
    DOLLOR
        26
    DOLLOR  
       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   ·   我们的愿景   ·   实用小工具   ·   5320 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 09:04 · PVG 17:04 · LAX 02:04 · JFK 05:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.