我有这个:
var g = [{a:'a'},{a:'2'},{a:'3'}]
var c = [{a:'4'},{a:'2'},{a:'5'}]
以下声明:
g[1] == c[1]
返回false,即使对象看起来相同。有没有什么方法可以比较它们,所以它会让我真实而不是虚假?
答案 0 :(得分:6)
您可以将它们编码为JSON:
JSON.stringify(g[1]) == JSON.stringify(c[1])
您可能也对this related question on identifying duplicate Javascript objects的答案感兴趣。
对于更复杂的选项,您可以查看annotated source code for Underscore's _.isEqual()
function(或只使用库)。
答案 1 :(得分:1)
==
运算符检查引用相等性。做你想做的事的唯一方法是对对象进行成员等式测试。
这应该有效:
function memberwiseEqual(a, b) {
if(a instanceof Object && b instanceof Object) {
for(key in a)
if(memberwiseEqual(a[key], b[key]))
return true;
return false;
}
else
return a == b;
}
警惕这类案件:
var a = {};
a.inner = a; //recursive structure!
答案 2 :(得分:0)
这里你比较内存中的引用,而不是它的值尝试这个,你会得到真的:
g[1]['a'] === c[1]['a']
答案 3 :(得分:0)
在JavaScript中,作为对象(包括数组)的变量实际上是对集合的引用。因此,当您编写var x = { a: 2 }
和var y = { a: 2 }
时,x
和y
将成为对两个不同对象的引用。因此x
不等于y
。但是,如果你做y = x
那么他们会(因为他们会共享相同的参考)。但是如果你改变了任何一个对象,那么另一个也会被改变。
因此,在处理对象和数组时,通过说==
,您正在检查两个引用是否相同。在这种情况下,他们不是。