严格的相等运算符将告诉您两个对象 类型 是否相等。但是,有没有办法判断两个对象是否相等, 就像 Java中 的哈希码 值 一样 ?
与这个问题相似,但需要更多的学术答案。上面的场景演示了为什么必须要有一个,而我想知道是否有任何 等效的解决方案 。
简短的答案
简单的答案是:不,没有通用的方法可以确定一个对象是否与您所指的含义相等。例外是,当您严格考虑对象是无类型的时。
长答案
该概念是一种Equals方法的概念,该方法比较对象的两个不同实例以指示它们在值级别上是否相等。但是,由特定类型决定如何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的任何两个实例是否相等,仅a且b是否重要并不重要。在某些情况下c,实例之间可能会有所不同,但在比较期间并不显着。
c
a
b
请注意,当成员本身也可能是类型的实例,并且每个成员都必须具有确定相等性的方法时,就会出现此问题。
更为复杂的是,在JavaScript中,数据和方法之间的区别变得模糊。
一个对象可以引用一个被称为事件处理程序的方法,而这可能不被认为是其“值状态”的一部分。尽管可以很好地为另一个对象分配执行重要计算的功能,从而使该实例与其他实例有所不同,仅仅是因为它引用了一个不同的功能。
如果某个对象的现有原型方法之一被另一个函数覆盖,那该怎么办?还是可以认为它等同于另一个实例,在其他方面相同吗?对于每种类型,只能在每种特定情况下回答该问题。
如前所述,该异常将是严格无类型的对象。在这种情况下,唯一明智的选择是每个成员的迭代和递归比较。即使这样,也必须问一个函数的“值”是什么?