为什么'0'不等于一个空列表?

Why is '0' not equal to an empty list?

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

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

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

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

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

  1. 0 == '0'

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

  2. 0 == []

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

  3. '0' == []

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

详情见Ecmascript Spec: 7.2.15: Abstract Equality Comparison

在JavaScript中,双等号不是严格等于,而三等号===是。在前一种情况下,根据所涉及的类型进行转换,而在后一种情况下不存在此类可用转换(导致 semi-equality)。

JavaScript 就是这样设计的。 在 0 == '0' == 将 '0' 转换为 0 因为右操作数是一个数字 那么会发生什么是它检查 0 == 0 这是真的。 提示使用===调用strick相等比较来检查,它将0当作一个数字,'0'当作一个字符串。

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

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

'0' == []

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

。您有 3 个案例。

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

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

  3. 而当您编写 0==[ ] 时,每个值为 0 的值都是 false,而空列表 returns 列表中元素数的布尔值对于 0 为 False 因此false ==false 为真