一尘不染

如何确定两个JavaScript对象的相等性?

javascript

严格的相等运算符将告诉您两个对象 类型 是否相等。但是,有没有办法判断两个对象是否相等, 就像 Java中 的哈希码
一样

与这个问题相似,但需要更多的学术答案。上面的场景演示了为什么必须要有一个,而我想知道是否有任何 等效的解决方案


阅读 283

收藏
2020-04-22

共1个答案

一尘不染

简短的答案

简单的答案是:不,没有通用的方法可以确定一个对象是否与您所指的含义相等。例外是,当您严格考虑对象是无类型的时。

长答案

该概念是一种Equals方法的概念,该方法比较对象的两个不同实例以指示它们在值级别上是否相等。但是,由特定类型决定如何Equals实现方法。具有原始值的属性的迭代比较可能还不够,可能存在一些不被视为对象值一部分的属性。例如,

 function MyClass(a, b)
 {
     var c;
     this.getCLazy = function() {
         if (c === undefined) c = a * b // imagine * is really expensive
         return c;
     }
  }

在上述情况下,c确定MyClass的任何两个实例是否相等,仅ab是否重要并不重要。在某些情况下c,实例之间可能会有所不同,但在比较期间并不显着。

请注意,当成员本身也可能是类型的实例,并且每个成员都必须具有确定相等性的方法时,就会出现此问题。

更为复杂的是,在JavaScript中,数据和方法之间的区别变得模糊。

一个对象可以引用一个被称为事件处理程序的方法,而这可能不被认为是其“值状态”的一部分。尽管可以很好地为另一个对象分配执行重要计算的功能,从而使该实例与其他实例有所不同,仅仅是因为它引用了一个不同的功能。

如果某个对象的现有原型方法之一被另一个函数覆盖,那该怎么办?还是可以认为它等同于另一个实例,在其他方面相同吗?对于每种类型,只能在每种特定情况下回答该问题。

如前所述,该异常将是严格无类型的对象。在这种情况下,唯一明智的选择是每个成员的迭代和递归比较。即使这样,也必须问一个函数的“值”是什么?

2020-04-22