在Javascript中,为什么[1,2]=[1,2]或({a:1})=({a:1})为false?
以下是在Firebug中完成的:在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
>>> [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%的用例!