deepequal js实现
DeepEqual 的 JavaScript 实现
在 JavaScript 中实现深度比较(DeepEqual)通常需要递归地比较对象或数组的每一个属性或元素,确保它们的值和类型完全一致。以下是一个常见的实现方式:
function deepEqual(a, b) {
// 处理基本类型和 null/undefined
if (a === b) return true;
if (a == null || b == null || typeof a !== 'object' || typeof b !== 'object') 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) {
// 处理基本类型和 null/undefined
if (a === b) return true;
if (a == null || b == null || typeof a !== 'object' || typeof b !== 'object') return false;
// 处理特殊对象类型
if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
if (a instanceof RegExp && b instanceof RegExp) return a.toString() === b.toString();
// 获取对象的键
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;
}
使用现成库的实现
在实际项目中,通常推荐使用现成的库来实现深度比较,例如 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
性能优化建议
对于大型对象的深度比较,递归实现可能导致堆栈溢出或性能问题。可以考虑以下优化:

- 使用迭代代替递归
- 添加循环引用检测
- 对已知的大对象结构采用定制化比较逻辑
测试用例示例
// 基本类型
console.log(deepEqual(1, 1)); // true
console.log(deepEqual('a', 'a')); // true
console.log(deepEqual(null, null)); // true
// 对象
console.log(deepEqual({ a: 1 }, { a: 1 })); // true
console.log(deepEqual({ a: 1 }, { a: 2 })); // false
// 数组
console.log(deepEqual([1, 2], [1, 2])); // true
console.log(deepEqual([1, 2], [1, 3])); // false
// 嵌套结构
console.log(deepEqual({ a: { b: 1 } }, { a: { b: 1 } })); // true






