猿问

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

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

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

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


ABOUTYOU
浏览 622回答 3
3回答

GCT1015

简短的回答简单的答案是:不,没有通用的方法来确定一个对象在你的意思上是否与另一个对象相等。例外情况是您严格考虑对象是无类型的。答案很长概念是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,实例之间可能会有所不同,但在比较期间却不显着。请注意,当成员本身也可以是类型的实例时,此问题适用,并且这些实例都需要具有确定相等性的方法。更复杂的是,在JavaScript中,数据和方法之间的区别是模糊的。一个对象可以引用一个被称为事件处理程序的方法,这可能不会被视为其“值状态”的一部分。而另一个对象可能被赋予执行重要计算的功能,从而使该实例与其他对象不同,仅仅因为它引用了不同的功能。如果某个对象的某个现有原型方法被另一个函数覆盖了?是否仍然可以认为它与其他实例相同?这个问题只能在每种类型的每个特定情况下得到解答。如前所述,异常将是严格无类型的对象。在这种情况下,唯一明智的选择是每个成员的迭代和递归比较。即使这样,人们也要问一个函数的“价值”是什么?

喵喵时光机

JavaScript for Objects中的默认相等运算符在引用内存中的相同位置时产生true。var x = {};var y = {};var z = x;x === y; // => falsex === 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);    // => falsekingOfSpades.equals(new Card(13, "S")); // => true
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答