js实现equal
实现 JavaScript 深度比较(equal)
在 JavaScript 中实现深度比较(deep equal)需要递归检查对象的每个属性或数组的每个元素。以下是几种常见方法:
基本值比较
对于基本类型(number, string, boolean, null, undefined, symbol),直接使用 === 进行比较:
if (a === b) return true;
日期对象比较
日期对象需要转换为时间戳进行比较:
if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime();
}
正则表达式比较
正则表达式需要比较其模式和标志:
if (a instanceof RegExp && b instanceof RegExp) {
return a.source === b.source && a.flags === b.flags;
}
对象和数组比较
对于对象和数组,需要递归比较每个属性或元素:
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)) return false;
if (!deepEqual(a[key], b[key])) return false;
}
return true;
}
完整实现示例
function deepEqual(a, b) {
if (a === b) return true;
if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime();
}
if (a instanceof RegExp && b instanceof RegExp) {
return a.source === b.source && a.flags === b.flags;
}
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)) return false;
if (!deepEqual(a[key], b[key])) return false;
}
return true;
}
使用现成库
对于生产环境,推荐使用成熟的库如 Lodash 的 _.isEqual:

const _ = require('lodash');
_.isEqual(object1, object2);
注意事项
- 循环引用会导致栈溢出,需要额外处理
- 函数比较通常返回 false,除非是同一引用
- Symbol 作为属性名时需要特殊处理
- 原型链上的属性不会被比较






