js实现equal
在JavaScript中实现深度比较(equal)功能,可以通过以下方法实现。根据比较需求的不同,可分为浅比较和深比较两种场景:
浅比较(Shallow Equal)
浅比较仅检查基本类型值或对象的引用是否相同,适用于简单对象或数组:
function shallowEqual(obj1, obj2) {
if (obj1 === obj2) return true;
if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {
return false;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) return false;
for (let key of keys1) {
if (obj1[key] !== obj2[key]) return false;
}
return true;
}
深比较(Deep Equal)
深比较会递归检查所有嵌套属性和值,适用于复杂对象或数组:
function deepEqual(obj1, obj2) {
if (obj1 === obj2) return true;
if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {
return false;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) return false;
for (let key of keys1) {
if (!deepEqual(obj1[key], obj2[key])) return false;
}
return true;
}
特殊场景处理
处理特殊对象如Date、RegExp等:
function deepEqualWithSpecialTypes(obj1, obj2) {
if (obj1 === obj2) return true;
if (obj1 instanceof Date && obj2 instanceof Date) return obj1.getTime() === obj2.getTime();
if (obj1 instanceof RegExp && obj2 instanceof RegExp) return obj1.toString() === obj2.toString();
if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {
return false;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) return false;
for (let key of keys1) {
if (!deepEqualWithSpecialTypes(obj1[key], obj2[key])) return false;
}
return true;
}
使用现成库
推荐使用现成工具库如lodash的_.isEqual:
const _ = require('lodash');
const isEqual = _.isEqual(obj1, obj2);
注意事项
- 循环引用会导致递归爆栈,需额外处理(如使用
WeakMap记录已比较对象)。 - 性能敏感场景建议使用浅比较或限制递归深度。
- 符号(Symbol)属性需通过
Object.getOwnPropertySymbols()单独处理。







