【问题标题】:What is the logic of comparing int with string and array? [duplicate]比较int与字符串和数组的逻辑是什么? [复制]
【发布时间】:2018-04-14 10:37:28
【问题描述】:

我试图在 Javascript 中使用等于 == 运算符,得到以下结果:

0 == "0" // true

还有

0 == [0] // true

但是:

"0" == [] // false

老实说,这让我有点困惑,因为我没有 Javascript 背景。

另外,我注意到:

"0" == [0] // true

这也适用于其他值:

1 == [1] // true
1 == "1" // true
"1" == [1] // true

101 == "101" // true
101 == [101] // true
"101" == [101] // true

所以这似乎是将0 与空数组[] 进行比较。

背后的逻辑是什么?

【问题讨论】:

标签: javascript logic equality


【解决方案1】:

如果您在 Mozila 开发者网络 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness 上看到 Loose Equalize using == 图表,您可以看到

如果操作数 A 在您的情况下是字符串 "0" 而操作数 B 在您的情况下是对象 [],那么操作数 B 将被转换为原始类型,例如 new String([]) 返回 ""

A == ToPrimitive(B)

如果我们尝试,

> typeof "0"
 "string"
> typeof []
 "object"

> "0"=="" // it will return false

如果你尝试使用

> 0==[]  // it will return true

【讨论】:

    【解决方案2】:

    这是因为类型强制(使用 double =)。基本上,当比较不同类型的变量时,javascript 会尝试将它们转换为相同类型并进行比较。为了避免这种情况,在比较变量时使用三等号 (===)。

    要了解有关 javascript 的更多信息,我推荐这些书籍(免费在线!

    https://github.com/getify/You-Dont-Know-JS

    但如果你对这个主题特别感兴趣,你可以阅读这个:

    https://github.com/getify/You-Dont-Know-JS/blob/master/types%20%26%20grammar/ch4.md

    PS。最后是您的示例详细说明。

    祝你好运!

    【讨论】:

      【解决方案3】:

      它基于Abstract equality comparison algorithm 工作。让我从你的例子中挑选一个例子来解释它是如何返回结果的,

      0 == [0]
      

      所以 AECA 的主要目的是将 lhs 和 rhs 归为同一类型。基于该算法,内部递归步骤会发生使两边的类型相同。

      i]   0 == [0]
      ii]  0 == toPrimitive([0])
      iii] 0 == '0'
      iv]  0 == toNumber('0')
      v]   0 == 0
      vi]  true
      

      【讨论】:

      • 那你怎么解释0==[]导致true
      • @yajiv 将执行相同的步骤,但将调用 toNumber('0'),而不是 toNumber('')。因此,当您将空字符串转换为数字时,它将是00 == 0 => true
      • 是否总是遵循这 6 个步骤?或者有时遵循的步骤更少?
      • @yajiv 检查重复项
      • @yajiv 取决于 LHS 和 RHS。看看上面链接的算法,你就会明白了。
      【解决方案4】:

      简而言之,javascript 会在大多数情况下尝试将等式的两边转换为不同类型的数字。 但是,对于对象,它将调用抽象操作 toPrimitive(带有默认提示)。该操作调用.valueOf,然后在结果上调用.toString,如果它仍然不是原始的(意味着不是对象)。

      0 == "0" => 0 == 0 => true
      
      0 == [0] => 0 == "0" ( .valueOf returns [0] so .toString is used)
      
      "0" == [] => "0" == "" => false ( they have the same type so the string must be the same to be true)
      
      0 == [] => 0 == "" => 0 == 0 : true
      

      完整资源在这里:

      https://www.ecma-international.org/ecma-262/8.0/#sec-abstract-equality-comparison
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 2015-07-06
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多