比较javascript中不同实例的类似对象

时间:2012-03-26 19:43:46

标签: javascript

我一直想知道为什么:

var a = [[0, 1]];
a[0] == [0, 1];

会返回false。看起来这两个数组,[0]和[0,1],尽管不是相同的Array实例,但实际上它们是同一个对象,因为它们的所有属性都是相同的。虽然JS不是这种情况,但我不知道为什么。

应用于这两个数组以及更复杂的对象的哪个测试会返回true? (jQuery和D3.js的答案被接受,我不打算使用任何其他答案)

编辑:使用JSON.stringify包装对象似乎有效;有什么警告我应该注意吗?

2 个答案:

答案 0 :(得分:2)

[Equal Operator]“如果两个操作数都是对象,则JavaScript会比较内部引用,当操作数引用内存中的同一对象时,它们是相等的。”

请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators

所以,甚至:

[0, 1] == [0, 1]

将返回false,因为它们是不同的对象,即使具有相同的内容。

如果使用数组文字会让您感到困惑,请注意上面的代码与以下代码完全相同:

new Array(0, 1) == new Array(0, 1);

答案 1 :(得分:0)

这两个对象具有相同的值,但不是同一个对象,例如,如果将新元素推送到另一个对象,则不会获得新的推送元素。

var a = [[0, 1]];
var b = [0, 1];
a[0].push(42);
alert(a[0].length);   // now it's 3
alert(b.length);      // still 2

另请注意,语法[0, 1]不代表数组对象,但它是一个数组对象“builder”,每次评估它时都会产生一个新的新数组:

function mkarr() {
    return [0, 1];
}

var a = mkarr();
var b = mkarr();
a.push(42);
alert(a.length);        // 3
alert(b.length);        // still 2
alert(mkarr().length);  // still 2 too

对于数字和字符串而不是匹配,因为引用的对象是不可变的(即,您可以使您的变量指向另一个数字,但您不能更改数字本身。)

在一个对象上调用JSON.stringify,你得到一个对象的字符串表示,而不是对象...并且表示对于不同的对象确实匹配相同(因为它们只是字符串)。

请注意,字符串表示形式并不真正捕获对象,并且您可以使用相同的字符串表示形式具有截然不同的对象...例如:

var a = [0, 1];
var b = [a, a];
var c = [[0, 1], [0, 1]];
alert(JSON.stringify(b) == JSON.stringify(c)); // true
b[0].push(42);
c[0].push(42);
alert(JSON.stringify(b)); // "[[0,1,42],[0,1,42]]"
alert(JSON.stringify(c)); // "[[0,1,42],[0,1]]"