PHP + JavaScript:将空字符串与 0 进行比较时幕后会发生什么


PHP + JavaScript: What happens behind scenes when comparing empty string to 0

由于松散的类型,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,该TypeNumber的,并且+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在与数字进行比较时似乎也会转换为数字,但是两个字符串比较为字符串。