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

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

本文关键字:obj JSON is false stringify parse      更新时间:2023-09-26

我在看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。为什么呢?

它们不相等的原因与此返回false相同:

({omg:'ay dios mio', check:true}) == ({omg:'ay dios mio', check:true})

不是比较对象内部的值,而是比较对象引用。

对象正在测试引用。

当原语在测试VALUE时

因为obj没有在内存中引用解析过的对象。这是两种不同的声明。如果你这样做:

var a = [ 10 ],
    b = [ 10 ];

则有两个具有相同值的数组实例,但这并不使它们成为相同的数组。所以是a != b,尽管10 == 10。您可以将a[0]的值增加到15,但这不会将b[0]的值更改为15。

因此,如果要比较对象,必须遍历它们并检查对象的值是否相同。

一个比较的函数(借用自jQuery的对象相等)

$.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;
};