【问题标题】:PHP + JavaScript: What happens behind scenes when comparing empty string to 0PHP + JavaScript:将空字符串与 0 进行比较时会发生什么
【发布时间】:2014-11-30 18:40:45
【问题描述】:

由于类型松散,PHP 必须将两个比较变量转换为相同类型,如果它们还没有。这个比较的幕后发生了什么:

$v = "" == 0;

它返回true。如果第一个变量的类型内部强制转换为第二个变量的类型,我可以理解:

$v = (int)"" === 0;

但如果是这样,逆向比较应该会失败:

$w = 0 == "";

因为

(string)0 = "0"

显然不等于""

但它也返回true

使用 JavaScript 也可以观察到相同的行为。

所以现在我问自己:那里发生了什么?!对我来说唯一的解释是这两个变量都被转换为布尔值。但在这种情况下,["X"] == "X" 应该返回 true,但显然不是。那么,假设 "" 等于 0 有什么魔力?

【问题讨论】:

  • 我知道如何使用===,但我只是想知道,对于这样的事情,PHP 遵循哪种算法。您的回答似乎是错误的,因为 [] == "" 返回 false,尽管两个参数都是 empty()
  • 我猜这就是 PHP 的设计方式。

标签: javascript php


【解决方案1】:

在 JavaScript 中,== 的行为在 The Abstract Equality Comparison Algorithm 中定义。

  • 当你做"" == +0时,由于Type("")StringType(+0)Number,返回值是比较结果ToNumber("") == +0

    ToNumber 应用于String 类型的行为在ToNumber Applied to the String Type 中定义。在我们的例子中,ToNumber("") 返回+0

    现在我们必须检查+0 == +0。由于两者具有相同的Type,即TypeNumber,并且+0+0 具有相同的Number 值,因此返回值为true

  • 当你做+0 == ""时,因为Type(+0)NumberType("")String,所以返回值是+0 == ToNumber("")比较的结果。

    ToNumber 应用于String 类型的行为在ToNumber Applied to the String Type 中定义。在我们的例子中,ToNumber("") 返回+0

    现在我们必须检查+0 == +0。由于两者具有相同的Type,即TypeNumber,并且+0+0 具有相同的Number 值,因此返回值为true

【讨论】:

  • ++ 没有注意到问题也包括javascript。很好的解释。
  • 很遗憾,我们不能接受两个答案。这个和 Aziz 的一样好,但是它解释了 JS,而他的一个解释了 PHP。但是 +1。
【解决方案2】:

在 PHP 中,当使用 equal 时,它会将输入转换为以下内容都相等:

0 == "" == false

哪些都将通过empty() 检查。

如果您想检查确切的类型,请改用===。为了回答您的评论,array() 不是一个变量,而是一个数据结构,这就是它未通过 == 检查但通过 empty() 检查的原因。

【讨论】:

  • 这就是我想知道的。谢谢
【解决方案3】:

php 在比较中偏爱整数,因此如果任一值是 int,则比较将作为 int 进行。

“int-ness”不是由类型决定的,而是由 is_numeric() 测试决定的。即使您不期望,字符串也会默默地转换为数字,因此 "1.2" == "1.20" 为真(!?)。某些版本的 php 过去常说如果两个长数字字符串具有相同前缀的 int 溢出,则它们是相等的。

在与数字比较时,Javascript 似乎也转换为数字,但两个字符串比较为字符串。

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 2016-12-22
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多