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