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等于比较表达式的值
答案 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比较当操作数引用同一个对象时相同的内部引用 存储器中。