在Javascript中,为什么[1,2]=[1,2]或({a:1})=({a:1})为false?

在Javascript中,为什么[1,2]=[1,2]或({a:1})=({a:1})为false?,javascript,Javascript,以下是在Firebug中完成的: >>> [1, 2] == [1, 2] false >>> ({a : 1}) == ({a : 1}) false 我认为Javscript有一个规则,如果一个对象或数组对相同元素有相同的引用,那么它们是相等的吗 但即使我说 >>> foo = {a : 1} Object { a=1} >>> [foo] == [foo] false >>> ({a: foo

以下是在Firebug中完成的:

>>> [1, 2] == [1, 2]
false

>>> ({a : 1}) == ({a : 1})
false
我认为Javscript有一个规则,如果一个对象或数组对相同元素有相同的引用,那么它们是相等的吗

但即使我说

>>> foo = {a : 1}
Object { a=1}

>>> [foo] == [foo]
false

>>> ({a: foo}) == ({a: foo})
false

是否有一种方法使其能够进行元素比较并返回
true

{}
[]
新对象
新数组

新对象!=新对象
(与数组相同),因为它们是新的不同对象

>>> var a = [1,2] var b = [1,2]
>>> a == b
false
>>> a == a
true
如果您想知道两个任意对象的内容对于某个相同值是否“相同”,则需要快速(但缓慢)修复

JSON.parse(o)==JSON.parse(o)

更优雅的解决方案是定义一个相等的函数(未测试)

警告:编写一个对所有输入都“起作用”的相等函数很难,一些常见的错误是
(null==未定义)===true
(NaN==NaN==false
,我在函数中都不支持这两个错误


我也没有处理任何跨浏览器问题,我只是假设ES5存在。

这是因为javascript对象文本不共享相同的指针。而是为每个指针创建一个新指针。考虑下面的例子:

>>> ({a : 1}) == ({a : 1})
false
。。。但是

>>> obj = ({a : 1});
Object

>>> obj == obj
true

obj
是指向literal对象
{a:1}
的指针。这是因为当你比较不同的对象时,指针是相同的

>>> var a = [1,2] var b = [1,2]
>>> a == b
false
>>> a == a
true

如果您想测试数组相等性,您可能需要使用一些库或自己编写测试。

要了解执行您所说的深度相等需要什么样的代码,请签出或。

对象文字创建新实例,定义两个实例不会使它们共享同一引用。这不是需要相等的“内部元素”?你有很多需要修补的功能。例如,
equal({},{})==false
。另外,我认为你的意思是用
\u equal
@davin
\u equal
递归,这只是一个惯例,我不知道如何处理
{}
[]
优雅。这也提出了
是否相等的问题(Object.create(foo),Object.create(bar))
应该是真的还是假的。@Raynos,约定,那又怎样?如果我决定将该函数更改为
myEqual
,它将中断,因为您需要更改两次。@davin当然会中断。如果您将其更改为
myEqual
您需要将所有引用更改为
equal
,包括
equal@Raynos,如果使用函数的name属性递归,则不会。这正是我想告诉您的。将递归更改为reference
\u equal
,您就可以解决这个问题!正如
\u equal>和
QUnit
的源代码所指出的,深度相等是一件非常重要的事情。正如您在答案中很快发现的;)我认为我的ES5尝试非常优雅,涵盖了99%的用例!