[英]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 中找到了这个:
它基本上读取[] == 0
与Number([]) == 0
相同,后者与0 == 0
相同,这是真的。 这不适用于严格===
。
除了第一条规则(即x is the same as y
没有其他规则可以比较对象。 这意味着一切都一样,内存地址也是如此。 由于它们不共享相同的内存地址,因此适用规则 10(返回 false)。
比较
x == y
,其中x
和y
是值,产生真或假。 这样的比较如下:
如果
Type(x)
与Type(y)
相同,则一种。 返回执行严格相等比较
x === y
。如果
x
为null
且y
undefined
,则返回 true。- 如果
x
ndefined
且y
为null
,则返回 true。- 如果
Type(x)
是Number
并且Type(y)
是String
,则返回比较结果x == ToNumber(y)
。- 如果
Type(x)
是String
并且Type(y)
是Number
,则返回比较结果ToNumber(x) == y
。- 如果
Type(x)
是Boolean
,则返回比较结果ToNumber(x) == y
。- 如果
Type(y)
是Boolean
,则返回比较结果x == ToNumber(y)
。- 如果
Type(x)
是String
、Number
或Symbol
并且Type(y)
是Object
,则返回比较的结果x == ToPrimitive(y)
。- 如果
Type(x)
是Object
并且Type(y)
是String
、Number
或Symbol
,则返回比较结果ToPrimitive(x) == y
。- 返回假
这个问题用对象引用和类型转换的知识来处理比较妥当。首先,在javascript中,对象值是通过引用存储的。所以我们可以说它与[]和[]不同,因为两个数组对应两个不同的addr in memory.Second, '==' 对左右都不是严格的操作, [] 和 0 都转化为false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.