为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2019-05-23 10:28:02
如何确定两个JavaScript对象的相等性?严格的相等运算符将告诉您两个对象类型是否相等。但是,有没有办法判断两个对象是否相等,就像Java中的哈希码值一样?Stack Overflow问题JavaScript中是否有任何类型的hashCode函数?类似于这个问题,但需要更多的学术答案。上面的场景说明了为什么需要有一个,我想知道是否有任何等效的解决方案。
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

简短的回答

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

答案很长

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

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

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

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


查看完整回答
反对 回复 2019-05-23
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-05-23
  • 3 回答
  • 0 关注
  • 620 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信