我一直想知道为什么:
var a = [[0, 1]];
a[0] == [0, 1];
会返回false
。看起来这两个数组,[0]和[0,1],尽管不是相同的Array实例,但实际上它们是同一个对象,因为它们的所有属性都是相同的。虽然JS不是这种情况,但我不知道为什么。
应用于这两个数组以及更复杂的对象的哪个测试会返回true? (jQuery和D3.js的答案被接受,我不打算使用任何其他答案)
编辑:使用JSON.stringify包装对象似乎有效;有什么警告我应该注意吗?
答案 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]]"