在 JavaScript 中,判断两个对象是否内容相同需要深度比较(逐层递归对比所有属性和值)。以下是 3 种实战方案,根据场景选择:
一、JSON.stringify 法(适合简单对象)
function isEqualSimple(obj1, obj2) {return JSON.stringify(obj1) === JSON.stringify(obj2);
}// 示例
const a = { name: "John", age: 25 };
const b = { name: "John", age: 25 };
console.log(isEqualSimple(a, b)); // true
缺点:
1、无法处理 undefined、函数、Symbol 类型属性;
2、属性顺序不同会被误判为不相等(如 {a:1, b:2} vs {b:2, a:1});
3、遇到 循环引用 会直接报错
二、递归深度对比法
function deepEqual(obj1, obj2) {// 类型不同直接返回 falseif (typeof obj1 !== typeof obj2) return false;// 基本类型直接比较(含 null)if (typeof obj1 !== 'object' || obj1 === null || obj2 === null) {return obj1 === obj2;}// 处理特殊对象类型if (obj1 instanceof Date && obj2 instanceof Date) return obj1.getTime() === obj2.getTime();if (obj1 instanceof RegExp && obj2 instanceof RegExp) return obj1.toString() === obj2.toString();// 数组和对象需遍历属性const keys1 = Object.keys(obj1);const keys2 = Object.keys(obj2);if (keys1.length !== keys2.length) return false;for (const key of keys1) {if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {return false;}}return true;
}// 示例
const obj1 = { name: "Alice", data: [1, { id: 1 }, new Date('2023-01-01')]
};
const obj2 = { data: [1, { id: 1 }, new Date('2023-01-01')], name: "Alice"
};
console.log(deepEqual(obj1, obj2)); // true
三、使用现成工具库(生产环境推荐)
1. lodash.isEqual
import _ from 'lodash';const objA = { a: [2, { e: 3 }], b: [4] };
const objB = { b: [4], a: [2, { e: 3 }] };
console.log(_.isEqual(objA, objB)); // true
2. fast-deep-equal(性能优化版)
npm install fast-deep-equal
import { equal } from 'fast-deep-equal';const x = { a: 1, b: { c: new Date() } };
const y = { b: { c: new Date() }, a: 1 };
console.log(equal(x, y)); // true
总结选择建议:
• 简单数据 → JSON.stringify
• 生产环境复杂对象 → lodash.isEqual
• 高频次性能敏感场景 → fast-deep-equal
• 特殊需求(如不可变数据) → 手写递归 + 定制逻辑