为什么相同的数组不相同?

时间:2017-08-08 19:04:24

标签: javascript arrays comparison operators

e.g。

$  node
> [1, 2, 3] == [1, 2, 3]
false

如果我错误地使用“相同”和“等效”,请道歉。

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

...其中double等于比较表达式的值

3 个答案:

答案 0 :(得分:4)

因为虽然他们可能具有相同的内容,但他们并没有在内存中指向相同的引用。

要获得更高的精确度,请想象以下示例

select value
from (select t.*, lag(value) over (order by date) as prev_value
      from t
     ) t
where prev_value is null or prev_value > value;

这是有道理的,因为两个数组是不同的对象,即使它们具有相似的值,例如,如果我们那么做

let arr1 = [1,2,3]
let arr2 = [1,2,3]
arr1 == arr2 //false

只有arr1会改变。

如果您正在寻找比较数组的解决方案,您可能会发现this thread很有用。

答案 1 :(得分:3)

它们是记忆中的不同位置。它们是两个完全不同的数组,恰好具有相同的值。

这就像说A人和B人都携带3个苹果,他们是同一个人吗? A人不能是B人。

答案 2 :(得分:3)

这[1,2,3]是一个数组对象。创建它时,您将获得对此数组的引用,该数组是指向内存中某个位置的指针。通过调用[1,2,3],您可以创建另一个数组,并获得完全不同的引用,指向内存中完全不同的位置。您在两种情况下创建的数组都包含相同的元素,为其创建保留了相同数量的内存,但它们实际上是两个完全不同的对象。

两个对象之间的相等性基于比较它们的引用,如果它们相同,则引用指向同一个对象,因此==运算符的求值为true。否则是false

正如更正式地陈述here

  

平等(==)

     

如果操作数不是同一类型,则等于运算符会转换操作数,然后应用严格比较。如果   两个操作数都是对象,然后JavaScript比较当操作数引用同一个对象时相同的内部引用   存储器中。