例子:'0' == false
PHP 官方文档中有这么描述
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
连接: http://www.php.net/manual/zh/language.operators.comparison.php
所以,'0' == false
,我能理解
那么,'false' == true
,我是不是应该理解为,先将'false'
转成整数型
而将字符串'false'
转成数字后,结果为0
,为什么等于true
呢?
参考: http://php.net/manual/zh/language.types.string.php#language.types.string.conversion
我该如何理解这个过程?
好吧,这题关闭了。
最终理解过程,当字符串和布尔值进行比较时,会先将字符串转换成布尔值。
而字符串中除了'0'
等于false
之外,其他字符串都等于true
。
即便是'0.0'、'-0'也都等于true
。
1
jihaiming 2017-06-20 11:32:29 +08:00
这里"false" 是字符串了
|
2
Scholer 2017-06-20 11:33:12 +08:00
'false' == true 既不是数字和字符串也不是涉及数字内容的字符串,所以这就是字符串和 bool 的比较,相当于 'a' == true
|
3
shooyaaa 2017-06-20 11:33:40 +08:00
官方文档里面说的规则仅限于字符串和数字比较的时候,并没有说和 bool 比较的时候也会转换为数字
|
4
harborM 2017-06-20 11:34:02 +08:00
‘ false ’是字符串,false 是布尔型
|
5
Light3 2017-06-20 11:36:46 +08:00
'false' 不是 false 你找个编辑器打一下啊 看看色都不一样 你就懂了 一个字符串 一个布尔
|
6
beyoung 2017-06-20 11:40:31 +08:00 via iPhone
非空字符串是 true 没毛病
|
7
iguoji OP |
8
2ME 2017-06-20 11:45:00 +08:00
非要说理解的话 这就是 php 的规则 ‘ false ’ 就是一个普通的字符串 普通字符串和 bool 比较并不会类型转换
你也可以发布个自己的语言 规则: ‘ false ’被定义为一个特殊的字符串 会被转换成 bool 进行比较 话说之前有遇到过类似的面试题 |
9
Tokin 2017-06-20 12:44:40 +08:00
|
10
Tokin 2017-06-20 12:49:42 +08:00
我试了一下,数字里面只有'0'是 false,'00'或者其它数字都是 true。
应该是 php 的规则限制了'0' |
11
levn 2017-06-20 12:55:28 +08:00
不是转成数字而是转成布尔吧
|
12
rming 2017-06-20 13:09:56 +08:00
|
13
changwei 2017-06-20 13:13:03 +08:00 via Android
php,js,这种弱类型还自动转换的编程语言,最容易考倒人,楼下来人,快给楼主奉上九九真值表(ಠ .̫.̫ ಠ)
|
14
bumz 2017-06-20 13:13:53 +08:00
== 这个运算符就是用来坑人的
|
16
UnisandK 2017-06-20 13:18:01 +08:00
而将字符串'false'转成数字后,结果为 0
这个理解不能。。'0' 强转成 0 我能理解,'false' 转成 0 是什么鬼 |
17
misaka19000 2017-06-20 13:21:00 +08:00 via Android
哈哈,PHP 的程序员再次验证了 PHP 是世界上最好的语言
|
19
troywinter 2017-06-20 13:32:07 +08:00
https://www.designcise.com/web/tutorial/how-to-evaluate-string-false-in-php
"Anything other than these values will always return true when evaluated. It may be useful to mention here that casting to boolean type, or using the settype won't do the trick here because "false" (i.e. string false) is not type converted to boolean false. In fact it evaluates to true which is actually the correct interpretation. This is simply due to the fact that it is a non-empty string, that by definition is truthy. However, this may be problematic because a boolean false value transported to a PHP script would be received as a string "false" — not what one might expect in some cases." |
20
jasontse 2017-06-20 13:35:03 +08:00 via iPad
'false' 转成 ASCII 不是 0 所以不等于 false
|
21
clino 2017-06-20 13:36:59 +08:00
如果 'false' 要等于 false,那 'False' 'FAlse' 'FALse' 'FALSe' 'FALSE' 这几个呢?
|
22
caola 2017-06-20 13:38:32 +08:00
只要是字符串类型的都是 true,不会转换成什么才比较。
除非是 === 才会比较类型 |
23
littleylv 2017-06-20 13:39:56 +08:00
正式的业务代码中不会这么写的,这么写的人基本被打死了
|
24
tabris17 2017-06-20 13:40:01 +08:00
阿西吧~'false'是字符串啊
|
25
troywinter 2017-06-20 13:41:17 +08:00
另外我再指出一点错误,为什么它会 evaluate 成 0,你引用的那篇 php 官网的文档明确说明了:
“该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0 (零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。” 很明显这个你转化成 int 的这个字符串不是一个数字的字符串表示,所以必然返回的是 0。 |
26
xzem 2017-06-20 13:44:51 +08:00 2
|
27
zjsxwc 2017-06-20 13:49:47 +08:00
我前几天碰到这个坑
<?php $a= 0; var_dump($a == "imageUrl");//输出 bool(true) |
28
wolfan 2017-06-20 13:50:41 +08:00 via Android
引起来了不是字串么?,既然字串里有东西为什么不是真?
|
29
icedx 2017-06-20 13:53:04 +08:00 via Android
很多语言都是'false'等于 true
|
30
w516322644 2017-06-20 15:26:16 +08:00
@zjsxwc 这个会把后面的字符串强制转换成 int。
|
31
demerol 2017-06-20 15:34:29 +08:00 via Android
if err 这种用法在弱类型的 js 里很常用,只有是非空非 false 就是 true
|
32
zi 2017-06-20 17:13:31 +08:00
@zjsxwc #27 var_dump(0 == "imageUrl", 0 == false, false == "imageUrl", intval("imageUrl"), boolval("imageUrl"));
|
33
skylancer 2017-06-20 17:31:45 +08:00
请注意安全性问题哟
|
34
goodan 2017-06-20 17:35:38 +08:00
虽然不会编程,但看标题就猜到是字符串。
|
35
bombless 2017-06-20 17:35:40 +08:00
false 转为字符串的时候是''
0 转为字符串的时候是'0' 所以感觉这里面并没有什么不对的( |
36
mylab 2017-06-20 18:34:30 +08:00
非空字符串==true 没问题啊
|
38
justplaymore 2017-06-21 01:11:56 +08:00
尽量用正确的方式去使用语言吧,隐式类型转换这种东西无论哪种语言,都是尽量避免去使用的,有这种特性不代表就应该去使用它,要衡量一下代价的。
|
40
2xShake 2017-07-03 13:50:44 +08:00
话说 php 里什么情况下你会用到 == ‘ false ’ 来走判断
|