Skip to content

如何在JavaScript中比较两个对象?

相等性比较

尽管两个不同的对象可以具有相同的属性和相等的值,但是当使用宽松相等运算符(==)或严格相等运算符(===)进行比较时,它们不被认为是相等的。这是因为JavaScript中的数组和对象是通过引用进行比较的,而不是通过值进行比较。

const a = { name: 'John', age: 26 };
const b = { name: 'John', age: 26 };

a === b; // false

JSON.stringify

JSON.stringify()经常被提到作为解决这个问题的方法。虽然在某些情况下它可能很有用,但是比较序列化的字符串可能会有自己的问题。其中最常见的问题与产生相同序列化字符串的相似但不相等的值有关。

const equals = (a, b) => JSON.stringify(a) === JSON.stringify(b);

const a = { name: 'John', age: 26 };
const b = { name: 'John', age: 26 };

equals(a, b); // true

```javascript
const c = { name: 'John' };
const d = { name: 'John', age: undefined };

equals(c, d); // true,应该是false

深度相等比较

事实证明,比较两个对象并不是一件简单的事情。这就是为什么浅层或深层相等比较的辅助函数如此常见的原因。这些函数通常使用递归来深度比较两个对象,考虑到大多数情况,如空值、特殊类型和嵌套。

const equals = (a, b) => {
  if (a === b) return true;
  if (a instanceof Date && b instanceof Date)
    return a.getTime() === b.getTime();
  if (!a || !b || (typeof a !== 'object' && typeof b !== 'object'))
    return a === b;
  if (a.prototype !== b.prototype) return false;
  const keys = Object.keys(a);
  if (keys.length !== Object.keys(b).length) return false;
  return keys.every(k => equals(a[k], b[k]));
};

const a = { name: 'John', age: 26 };
const b = { name: 'John', age: 26 };

equals(a, b); // true

const c = { name: 'John' };
const d = { name: 'John', age: undefined };

equals(c, d); // false

上述辅助函数处理了所有这些问题,并在equals代码片段中有更详细的解释。