关于javascript:obj == JSON.parse(JSON.stringify(obj))为false

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

本问题已经有最佳答案,请猛点这里访问。

我看着Chrome中的javascript控制台,发现了一些奇怪的东西,尽管它们看起来是一样的,但objJSON.parse(JSON.stringify(obj))并不相同。为什么会这样?

1
2
3
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。为什么会这样?


它们不相等的原因与返回错误的原因相同:

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

您不是在比较对象内部的值,而是对象引用。他们会不同的。


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

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

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

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

要比较的函数(从jquery对象等同性借用)

1
2
3
4
5
6
7
8
9
10
11
$.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;
};


对象正在测试引用。

而基元正在测试值。