我正在查看Chrome中的JavaScript控制台并发现一些奇怪的内容,即使它们看起来相同,obj
和JSON.parse(JSON.stringify(obj))
也不一样。那是为什么?
var obj = {test:'this is a test', another: {omg:'ay dios mio', check:true}};
console.log(obj, JSON.parse(JSON.stringify(obj)));
console.log(obj == JSON.parse(JSON.stringify(obj)));
它们看起来相同,但在检查相等性时返回false。那是为什么?
答案 0 :(得分:8)
由于返回false的相同原因,它们不相等:
({omg:'ay dios mio', check:true}) == ({omg:'ay dios mio', check:true})
您不是要比较对象内部的值,而是对象引用。他们会有所不同。
答案 1 :(得分:4)
对象正在测试REFERENCES。
虽然原语正在测试VALUE。
答案 2 :(得分:4)
因为obj
未在内存中引用已解析的对象。所以这些是两个不同的声明。如果你这样做:
var a = [ 10 ],
b = [ 10 ];
然后有2个具有相同值的数组实例,但这并不会使它们成为相同的数组。所以a != b
,即使是10 == 10
。您可以将a[0]
的值增加到15,但这不会将b[0]
的值更改为15。
因此,如果要比较对象,则必须循环遍历它们并检查对象的值是否相同。
要比较的函数(借用jQuery object equality)
$.fn.equals = function(compareTo) {
if (!compareTo || this.length != compareTo.length) {
return false;
}
for (var i = 0; i < this.length; ++i) {
if (this[i] !== compareTo[i]) {
return false;
}
}
return true;
};