js实现equal
实现深度比较(deep equal)的方法
在JavaScript中实现深度比较(deep equal)需要递归地检查对象或数组的每个属性或元素是否相等。以下是一个实现方案:
function deepEqual(a, b) {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
return false;
}
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
for (const key of keysA) {
if (!keysB.includes(key) || !deepEqual(a[key], b[key])) {
return false;
}
}
return true;
}
处理特殊情况的注意事项
Date对象和RegExp对象需要特殊处理,因为它们虽然是对象但需要比较内部值而非引用:
function deepEqual(a, b) {
// 处理Date对象
if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime();
}
// 处理RegExp对象
if (a instanceof RegExp && b instanceof RegExp) {
return a.toString() === b.toString();
}
// 其余代码与之前相同
}
性能优化建议
对于大型对象的深度比较可能会很耗性能,可以考虑以下优化策略:
- 添加循环引用检测
- 使用WeakMap来跟踪已比较过的对象
- 对于已知结构的对象可以编写特定的比较逻辑
function deepEqual(a, b, seen = new WeakMap()) {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
return false;
}
// 检查循环引用
if (seen.has(a) && seen.has(b)) {
return seen.get(a) === seen.get(b);
}
seen.set(a, b);
seen.set(b, a);
// 其余比较逻辑
}
现成库的使用方案
如果不想自己实现,可以使用现成的库如lodash的_.isEqual方法:

const _ = require('lodash');
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } };
console.log(_.isEqual(obj1, obj2)); // true
这种方法经过了充分测试,支持各种边界情况,是生产环境推荐的做法。






