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

2014-02-17 16:39:57 +08:00
 Part
array() == "" false
array() == 0 false
array() == false true
array() == null true

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

以上这些结果如何才能够解释得通?
3028 次点击
所在节点    PHP
12 条回复
Part
2014-02-17 17:01:38 +08:00
By the way,如何找出某函数在PHP中的实现,git源码(https://github.com/php/php-src)中,无从下手。
picasso250
2014-02-17 17:07:34 +08:00
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
2014-02-17 17:09:45 +08:00
研究它为什么这么转换我觉得没什么意义。
知道这个的存在,谨慎使用松散比较就可以了。
picasso250
2014-02-17 17:11:30 +08:00
更正 规则0:如果两者都是字符串/数字,会转换成数字。(数字亲和原则)
picasso250
2014-02-17 17:15:47 +08:00
@Part 请将源码下载下来,在 *.c 中搜函数名!

!!!
Part
2014-02-17 17:24:42 +08:00
jakwings
2014-02-17 17:40:33 +08:00
我的观点和 shiny 的差不多。这种比较没什么大的意义,假如你编程语言接触得更多了,就越是会有这种感觉,平时应该用 === 而不是 == ,不确定是什么类型时,最好先判断类型。
FrankFang128
2014-02-17 18:28:41 +08:00
避免这些比较
Mutoo
2014-02-17 21:06:03 +08:00
最近看 《maintainable javascript》 里面有提及在js中类似的情况,是由js的隐似类型转换决定的。

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

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

array()与""作比较,转换成 String 后是 "Array",结果当然不相等
""与false比较,""转换成bool后即false,所以相等
picasso250
2014-02-18 13:19:59 +08:00
array()与""作比较,转换成 String 后是 "Array",结果当然不相等 // 错误的原理

@Mutoo 请看文档


反正是能用 === 的不要用 == 就对了。
tonitech
2014-02-20 21:48:52 +08:00
楼主为什么要比较这些啊?
@picasso250 感谢你的分享!
Part
2014-02-25 08:50:22 +08:00
@tonitech 被一个“特别思维的”家伙问倒过...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/100598

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX