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

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

堆栈溢出问题JavaScript中是否有任何种类的hashCode函数? 类似于这个问题,但需要更多的学术答案。 上面的场景说明了为什么有必要有一个,我想知道是否有任何同等的解决方案


简短的答案

简单的答案是:不,没有通用的方法来确定某个对象在你意思上与另一个对象相等。 例外是当你严格考虑一个无类型的对象时。

长的答案

这个概念是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中,数据和方法之间的区别是模糊的。

一个对象可能会引用一个被称为事件处理程序的方法,这可能不会被视为其“值状态”的一部分。 而另一个对象可能被赋予一个执行重要计算的功能,从而使这个实例与其他实例不同,因为它引用了不同的功能。

怎么样一个对象有一个现有的原型方法被另一个函数覆盖? 它仍然可以被认为与其他情况相同吗? 这个问题只能在每种类型的每种特定情况下得到解答。

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


为什么重新发明轮子? 给Lodash一个尝试。 它有许多必须具备的功能,如isEqual()。

_.isEqual(object, other);

它会蛮力检查每个键值 - 就像本页面上的其他示例一样 - 使用ECMAScript 5和原生优化(如果它们在浏览器中可用)。

注意:此前的回答建议使用Underscore.js,但lodash在纠正错误并解决一致性问题方面做得更好。


当对象引用内存中的相同位置时,JavaScript for Object中的默认相等运算符为真。

var x = {};
var y = {};
var z = x;

x === y; // => false
x === z; // => true

如果你需要一个不同的等号运算符,你需要添加一个equals(other)方法或类似的东西到你的类中,问题域的具体细节将决定这意味着什么。

这是一个扑克牌的例子:

function Card(rank, suit) {
  this.rank = rank;
  this.suit = suit;
  this.equals = function(other) {
     return other.rank == this.rank && other.suit == this.suit;
  };
}

var queenOfClubs = new Card(12, "C");
var kingOfSpades = new Card(13, "S");

queenOfClubs.equals(kingOfSpades); // => false
kingOfSpades.equals(new Card(13, "S")); // => true
链接地址: http://www.djcxy.com/p/27325.html

上一篇: How to determine equality for two JavaScript objects?

下一篇: Finding property in Object