由于松散的类型,PHP 必须将两个比较变量转换为相同的类型,如果它们还没有的话。此比较的幕后情况:
$v = "" == 0;
它返回true
。如果第一个变量的类型在内部转换为第二个变量的类型,我可以理解它:
$v = (int)"" === 0;
但如果是这样,反向比较应该失败:
$w = 0 == "";
因为
(string)0 = "0"
这显然不等于""
.
但它也返回true
。
在 JavaScript 中可以观察到相同的行为。
所以现在我问自己:那里发生了什么?!对我来说,唯一的解释是这两个变量都被转换为布尔值。但在这种情况下,["X"] == "X"
应该返回 true,但显然不会。那么,假设""
等于0
有什么魔力呢?
在 JavaScript 中,==
的行为在抽象相等比较算法中定义。
-
当你做
"" == +0
时,因为Type("")
是String
的,Type(+0)
是Number
的,所以返回的值是比较ToNumber("") == +0
的结果。将
ToNumber
应用于String
类型的行为在应用于字符串类型的 ToNumber 中定义。在我们的例子中,ToNumber("")
返回+0
。现在我们必须检查
+0 == +0
.由于两者都具有相同的Type
,该Type
是Number
的,并且+0
和+0
具有相同的Number
值,因此返回值为true
。 -
当你做
+0 == ""
时,因为Type(+0)
是Number
的,Type("")
是String
的,所以返回的值是比较+0 == ToNumber("")
的结果。将
ToNumber
应用于String
类型的行为在应用于字符串类型的 ToNumber 中定义。在我们的例子中,ToNumber("")
返回+0
.现在我们必须检查
+0 == +0
.由于两者都具有相同的Type
,该Type
Number
,并且+0
和+0
具有相同的Number
值,因此返回值为true
。
在 PHP 中使用 equal 时,它将转换输入,以便以下内容都相等:
0 == "" == false
这一切都将通过empty()
检查。
如果要检查确切的类型,请改用===
。为了回答您的评论,array(( 不是一个变量,而是一个数据结构,这就是为什么它未能通过==
检查但通过了empty()
检查。
php 在比较中偏爱整数,因此如果任一值是 int,则比较将作为 int 完成。
"int-ness"不是由类型决定的,而是由is_numeric((测试决定的。 即使您不期望字符串也会静默转换为数字,因此"1.2" == "1.20" 是正确的 (!?(。 一些版本的 php 曾经说两个长数字字符串是相等的,如果它们有一个带有标识符前缀的 int 溢出。
Javascript在与数字进行比较时似乎也会转换为数字,但是两个字符串比较为字符串。