== 比较 array() 、0 、"" 、 false、null - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Part
V2EX    PHP

== 比较 array() 、0 、"" 、 false、null

  •  
  •   Part Feb 17, 2014 3471 views
    This topic created in 4455 days ago, the information mentioned may be changed or developed.
    array() == "" false
    array() == 0 false
    array() == false true
    array() == null true

    "" == 0 true
    "" == false true
    0 == null true
    "" == null true

    以上这些结果如何才能够解释得通?
    div class="cell">12 replies    1970-01-01 08:00:00 +08:00
    Part
        1
    Part  
    OP
       Feb 17, 2014
    By the way,如何找出某函数在PHP中的实现,git源码(https://github.com/php/php-src)中,无从下手。
    picasso250
        2
    picasso250  
       Feb 17, 2014   3
    http://www.php.net/manual/en/language.operators.comparison.php

    请注意阅读文档中的转换表(规则1至规则7)

    规则0: 如果两者中包含数字或者数字式的字符串,会变成数字。(数字亲和原则)所以,257就是正确的

    1. array() == "" false // array和任意东西比较 array较大 规则7
    2. array() == 0 false // array和任意东西比较 array较大 规则7
    3. array() == false true // bool和任意东西比较,转换为bool 规则2
    4. array() == null true // null和任意东西比较,转换为bool 规则2

    5. "" == 0 true // 规则0
    6. "" == false true // 规则2
    7. 0 == null true // 规则2
    8. "" == null true // null转换为"" 规则1

    请再次阅读文档。

    ps
    我觉得这问题很无聊(更无聊的是我竟然回答你……)
    shiny
        3
    shiny  
    PRO
       Feb 17, 2014   1
    研究它为什么这么转换我觉得没什么意义。
    知道这个的存在,谨慎使用松散比较就可以了。
    picasso250
        4
    picasso250  
       Feb 17, 2014
    更正 规则0:如果两者都是字符串/数字,会转换成数字。(数字亲和原则)
    picasso250
        5
    picasso250  
       Feb 17, 2014
    @Part 请将源码下载下来,在 *.c 中搜函数名!

    !!!
    Part
        6
    Part  
    OP
       Feb 17, 2014
    jakwings
        7
    jakwings  
       Feb 17, 2014
    我的观点和 shiny 的差不多。这种比较没什么大的意义,假如你编程语言接触得更多了,就越是会有这种感觉,平时应该用 === 而不是 == ,不确定是什么类型时,最好先判断类型。
    FrankFang128
        8
    FrankFang128  
       Feb 17, 2014
    避免这些比较
    Mutoo
        9
    Mutoo  
       Feb 17, 2014
    最近看 《maintainable Javascript》 里面有提及在js中类似的情况,是由js的隐似类型转换决定的。

    两个类型不一致的对象比较时,会将较高阶的一方转换成较低阶的,再进行比较,例如隐式调用 valueOf() 或者 toString()

    php与Javascript有许多的相似之处,可以这样理解

    array()与""作比较,转换成 String 后是 "Array",结果当然不相等
    ""与false比较,""转换成bool后即false,所以相等
    picasso250
        10
    picasso250  
       Feb 18, 2014
    array()与""作比较,转换成 String 后是 "Array",结果当然不相等 // 错误的原理

    @Mutoo 请看文档


    反正是能用 === 的不要用 == 就对了。
    tonitech
        11
    tonitech  
       Feb 20, 2014
    楼主为什么要比较这些啊?
    @picasso250 感谢你的分享!
    Part
        12
    Part  
    OP
       Feb 25, 2014
    @tonitech 被一个“特别思维的”家伙问倒过...
    About     Help     Advertise     Blog     API     FAQ     Solana     842 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 20:41 PVG 04:41 LAX 13:41 JFK 16:41
    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