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

Spe*_*rds 2 javascript json object

我正在查看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)));
Run Code Online (Sandbox Code Playgroud)

它们看起来相同,但在检查相等性时返回false.这是为什么?

Ove*_*erv 8

由于返回false的相同原因,它们不相等:

({omg:'ay dios mio', check:true}) == ({omg:'ay dios mio', check:true})
Run Code Online (Sandbox Code Playgroud)

您不是要比较对象内部的值,而是对象引用.他们会有所不同.


Dáv*_*abó 5

这些对象正在测试参考。

当原语正在测试 VALUE 时。


Nie*_*els 5

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

var a = [ 10 ],
    b = [ 10 ];
Run Code Online (Sandbox Code Playgroud)

然后有两个具有相同值的数组实例,但这并不会使它们成为相同的数组。所以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;
};
Run Code Online (Sandbox Code Playgroud)