繁体   English   中英

Javascript 数组等于零但不等于本身

[英]Javascript array equal to zero but not itself

我一直在玩 JavaScript 中的数组,但无法弄清楚为什么会发生这种情况:

 console.log(0 == 0) //true console.log([] == 0) //true console.log(0 == []) //true console.log([] == []) //false console.log([] == ![]) // true

空数组在左右两边都等于零,但为什么它不等于自己呢?

我意识到比较两个对象不会导致true ,但是如果将它们与0进行比较,为什么它们会被强制为0 (或假的,这不应该是这种情况),而如果将它们与另一个数组进行比较,它们会作为对象受到威胁?

console.log(0 == [])
//true 

您正在尝试将对象与整数进行比较,因此您的对象被隐式类型转换为等效的整数值 0

console.log([] == [])
//false 

因为两个对象永远不相等

console.log([] == [])

那会比较 array1 和 array2 是否是内存中的同一个数组对象,这不是你想要的。

为了执行您想要的操作,您需要检查两个数组是否具有相同的长度,以及每个索引中的每个成员是否相同。

console.log([].length == [].length)
// true

由于从未给出完整的答案,而且我现在实际上已经理解了,我将自己提供答案。

我在 Ecma-262 pdf 中找到了这个:

它基本上读取[] == 0Number([]) == 0相同,后者与0 == 0相同,这是真的。 这不适用于严格===

除了第一条规则(即x is the same as y没有其他规则可以比较对象。 这意味着一切都一样,内存地址也是如此。 由于它们不共享相同的内存地址,因此适用规则 10(返回 false)。

比较x == y ,其中xy是值,产生真或假。 这样的比较如下:

  1. 如果Type(x)Type(y)相同,则

    一种。 返回执行严格相等比较x === y

  2. 如果xnully undefined ,则返回 true。

  3. 如果x ndefinedynull ,则返回 true。
  4. 如果Type(x)Number并且Type(y)String ,则返回比较结果x == ToNumber(y)
  5. 如果Type(x)String并且Type(y)Number ,则返回比较结果ToNumber(x) == y
  6. 如果Type(x)Boolean ,则返回比较结果ToNumber(x) == y
  7. 如果Type(y)Boolean ,则返回比较结果x == ToNumber(y)
  8. 如果Type(x)StringNumberSymbol并且Type(y)Object ,则返回比较的结果x == ToPrimitive(y)
  9. 如果Type(x)Object并且Type(y)StringNumberSymbol ,则返回比较结果ToPrimitive(x) == y
  10. 返回假

这个问题用对象引用和类型转换的知识来处理比较妥当。首先,在javascript中,对象值是通过引用存储的。所以我们可以说它与[]和[]不同,因为两个数组对应两个不同的addr in memory.Second, '==' 对左右都不是严格的操作, [] 和 0 都转化为false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM