为什么需要深度对象比较?

Why do you need deep object comparison?

提问人:shapeless 提问时间:12/10/2021 最后编辑:Inigoshapeless 更新时间:12/10/2021 访问量:942

问:

参考: https://dmitripavlutin.com/how-to-compare-objects-in-javascript/

以下参考,深度比较是:

深度相等与浅层相等相似,但有一个区别。在浅层检查期间,如果比较的属性是对象,则对这些嵌套对象执行递归浅层相等性检查。

const objA = {
  propA: 123
  propB: 'a'
  propObj1: { // assume reference: 1234
     propObj1: 'abc'
  }
}

const objB = {
  propA: 123
  propB: 'a'
  propObj1: { // assume reference: 1234
     propObj1: 'abc'
  }
}

在浅层比较中,和在深层比较中是否可能相等,但在深度比较中却不能相等?objAobjB

因为它们具有相同的参照物,所以更改 to 也会反映到,这意味着它们在深度比较中也将相等。你能举一个例子,它既是浅层比较,又是深度比较吗?propObj1objA.propObj1objB.propObj1truefalse

javascript typescript 相等 deep-diff

评论

0赞 Teemu 12/10/2021
"它们的 propObj1 具有相同的引用“,它们没有,这两个属性都是内存中的独立对象。如果像这样创建: ,那么它们将引用相同的对象。propObj1objBpropObj1: objA.propObj1
2赞 VLAZ 12/10/2021
很少会拥有你在这里描述的东西 - 两个共享内部对象属性的对象。很多时候,这种情况会发生,这是因为它是一个错误——你已经“克隆”了对象,但没有意识到它是一个浅层克隆。是的,在某些情况下,您会想要相同的对象而不是它的克隆,但是,这种情况很少见。所以,在你描述的场景中 - 不,你不需要深入比较。但是 1.你很少会拥有它 2.您还遗漏了多个嵌套。如果你看过真实的用例,你就不会问这个问题了。

答:

2赞 Inigo 12/10/2021 #1

你回答了你自己的问题!在示例中,您必须说“假设参考:1234”这一事实表明,您知道,如果指向不同但相等的值(即您的确切示例,但没有“假设参考:1234”注释),则浅层比较将不起作用。propObj1

objA下面将无法通过浅等值检查,但通过深等值检查:objB

const objA = {
  propA: 123
  propB: 'a'
  propObj1: {
     propObj1: 'abc'
  }
}

const objB = {
  propA: 123
  propB: 'a'
  propObj1: {
     propObj1: 'abc'
  }
}