【问题标题】:Why is '0' not equal to an empty list? [duplicate]为什么“0”不等于空列表? [复制]
【发布时间】:2020-08-22 20:05:42
【问题描述】:

如果0(作为数字)等于0作为字符串,0等于空列表,为什么作为字符串的0不等于空列表(从0作为一个数字等于0作为一个字符串)?

> 0 == '0'
true
> 0 == []
true
> '0' == []
false

【问题讨论】:

  • 这已经被问过无数次了,绝对可以称得上是纯副本。
  • @Hi-IloveSO 是的,我没看到。

标签: javascript equals


【解决方案1】:

要了解代码的结果,您需要了解== 相等运算符在以下情况下的工作原理:

  • 当两个操作数的类型相同时,返回严格相等比较的结果===
  • 如果一个操作数是数字而另一个是字符串,则将字符串操作数转换为数字
  • 如果任何或两个操作数都是非原始的,则将非原始操作数转换为原始值

牢记上述几点,让我们看看如何处理每个比较:

  1. 0 == '0'

    这是因为 '0' 被转换为数字,然后执行严格的相等比较,因为在 '0' 转换为数字之后两个操作数具有相同的类型。

  2. 0 == []

    返回真,因为当== 运算符的任何操作数是非原始的时,它会被转换为原始值。将空数组转换为原始值时,会产生一个空字符串。所以在这个转换之后,你有0 == ''。现在一个操作数是一个数字,另一个是一个字符串。然后将空字符串转换为导致0 的数字,从而导致0 == 0 的比较结果为真。

  3. '0' == []

    这返回 false,因为空数组被转换为原始值,即空字符串。当[]转换为空字符串时,两个操作数('0' == '')的类型相同,所以会进行严格的相等比较,返回false。

详情见Ecmascript Spec: 7.2.15: Abstract Equality Comparison

【讨论】:

    【解决方案2】:

    在 JavaScript 中,双重等于并不意味着严格等于,而三重等于 === 确实如此。在前一种情况下,会根据所涉及的类型进行转换,而在后一种情况下则不存在这种可用的转换(这会导致半等式)。

    【讨论】:

      【解决方案3】:

      JavaScript 就是这样设计的。 在0 == '0' == 将 '0' 转换为 0,因为右操作数是数字 所以会发生什么是它检查 0 == 0 这是真的。 提示使用=== 称为严格相等比较来检查,它将0 视为数字,'0' 视为字符串。

      0 == [] 在 Javascript 中,空数组被视为假,而 0 始终为假,1 始终为真。

      所以 == 比较 false == false 这是真的。再次使用严格的公平符号===

      '0' == []

      这里因为 [] 不是数字,Javascript 不会关心将 '0' 转换为 0,这意味着比较是比较字符串和数组,这不会是真的。

      【讨论】:

        【解决方案4】:

        。您有 3 个案例。

        1. 当你写 '0' == 0 时,utf-8 中 '0' 的值是 0 因此
          假==假为真

        2. String 基本上是 python 中的一个列表,当你写 '0' 时,你基本上是在创建一个包含元素 ' 的列表 '0' 即 '0' ==['0'] 而不是 [ ] 因此 true==false 是 false

        3. 当你写 0==[ ] 时,每个值为 0 的值都是 false,而空列表返回列表中元素数量的布尔值,对于 0 为 False,因此 false ==false 为 true

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          • 2019-04-16
          • 2012-04-19
          • 2020-04-27
          相关资源
          最近更新 更多