obj == JSON.parse(JSON.stringify(obj))为false

时间:2014-07-20 11:34:18

标签: javascript json object

我正在查看Chrome中的JavaScript控制台并发现一些奇怪的内容,即使它们看起来相同,objJSON.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。那是为什么?

3 个答案:

答案 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;
};