为什么相同的数组不等价?
why is an identical array not equivalent?
例如
$ node
> [1, 2, 3] == [1, 2, 3]
false
如果我使用 "identical" 和 "equivalent" 不正确,我深表歉意。
console.log([1, 2, 3] == [1, 2, 3]);
我问,因为我习惯了Ruby
等语言
$ irb
irb(main):001:0> [1,2,3] == [1,2,3]
=> true
...或Python
$ python
>>> [1,2,3] == [1,2,3]
True
... 其中双等号比较表达式的值
它们在内存中的位置不同。它们是两个完全不同的数组,只是恰好具有相同的值。
好比说A和B都拿着3个苹果,他们是同一个人吗? A 不可能是 B。
这个[1,2,3]是一个数组对象。当您创建它时,您将获得对该数组的引用,即指向内存中某个位置的指针。通过调用 [1,2,3],你创建了另一个数组,你得到了一个完全不同的引用,一个指向内存中完全不同位置的指针。您在这两种情况下创建的数组包含相同的元素,为它们的创建保留了相同数量的内存,但它们实际上是两个完全不同的对象。
两个对象之间的相等性是基于比较它们的引用,如果它们相同,那么引用指向同一个对象所以==
运算符的计算结果是true
。否则就是false
.
更正式地说 here:
Equality (==)
The equality operator converts the operands if they are not of the same type, then applies strict comparison. If
both operands are objects, then JavaScript compares internal references which are equal when operands refer to the same object in
memory.
因为虽然它们可能具有相同的内容,但它们并不指向内存中的相同引用。
为了更精确,请想象以下示例
let arr1 = [1,2,3]
let arr2 = [1,2,3]
arr1 == arr2 //false
这是有道理的,因为这两个数组是不同的对象,即使它们具有相似的值,例如如果我们当时做了
arr1.push(4)
只有 arr1 会改变。
如果您正在寻找比较数组的解决方案,您可能会发现 this thread 很有用。
例如
$ node
> [1, 2, 3] == [1, 2, 3]
false
如果我使用 "identical" 和 "equivalent" 不正确,我深表歉意。
console.log([1, 2, 3] == [1, 2, 3]);
我问,因为我习惯了Ruby
等语言$ irb
irb(main):001:0> [1,2,3] == [1,2,3]
=> true
...或Python
$ python
>>> [1,2,3] == [1,2,3]
True
... 其中双等号比较表达式的值
它们在内存中的位置不同。它们是两个完全不同的数组,只是恰好具有相同的值。
好比说A和B都拿着3个苹果,他们是同一个人吗? A 不可能是 B。
这个[1,2,3]是一个数组对象。当您创建它时,您将获得对该数组的引用,即指向内存中某个位置的指针。通过调用 [1,2,3],你创建了另一个数组,你得到了一个完全不同的引用,一个指向内存中完全不同位置的指针。您在这两种情况下创建的数组包含相同的元素,为它们的创建保留了相同数量的内存,但它们实际上是两个完全不同的对象。
两个对象之间的相等性是基于比较它们的引用,如果它们相同,那么引用指向同一个对象所以==
运算符的计算结果是true
。否则就是false
.
更正式地说 here:
Equality (==)
The equality operator converts the operands if they are not of the same type, then applies strict comparison. If both operands are objects, then JavaScript compares internal references which are equal when operands refer to the same object in memory.
因为虽然它们可能具有相同的内容,但它们并不指向内存中的相同引用。
为了更精确,请想象以下示例
let arr1 = [1,2,3]
let arr2 = [1,2,3]
arr1 == arr2 //false
这是有道理的,因为这两个数组是不同的对象,即使它们具有相似的值,例如如果我们当时做了
arr1.push(4)
只有 arr1 会改变。
如果您正在寻找比较数组的解决方案,您可能会发现 this thread 很有用。