如何确定两个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的任何两个实例是否相等并不重要,只有a
和b
很重要。 在某些情况下, 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