所有JavaScript文字对象是否彼此不同

时间:2011-10-03 21:15:52

标签: javascript

我有这个:

var g = [{a:'a'},{a:'2'},{a:'3'}]
var c = [{a:'4'},{a:'2'},{a:'5'}]

以下声明:

g[1] == c[1]

返回false,即使对象看起来相同。有没有什么方法可以比较它们,所以它会让我真实而不是虚假?

4 个答案:

答案 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 }时,xy将成为对两个不同对象的引用。因此x不等于y。但是,如果你做y = x那么他们会(因为他们会共享相同的参考)。但是如果你改变了任何一个对象,那么另一个也会被改变。

因此,在处理对象和数组时,通过说==,您正在检查两个引用是否相同。在这种情况下,他们不是。