JavaScript深度比对需递归+类型分发,用Object.keys()+every()校验键名数量及值相等,Array.isArray()区分数组与对象,Object.entries()简化遍历,再特殊处理null、NaN、Date等类型。
javascript 中没有内置的深度比对方法,但可以通过数组方法(如 every、some、map、filter 等)配合递归,实现对象的深度比对。关键不是“用数组方法代替递归”,而是利用数组方法处理对象的键值对或嵌套结构,让逻辑更清晰、可读性更强。
用 Object.keys() + every() 比较对象自有属性
深度比对的第一步是确认两个对象拥有相同的键名和数量。可以用 Object.keys() 获取键数组,再用 every() 遍历每个键,检查对应值是否“深度相等”:
- 先判断键的数量是否一致,否则直接返回
false - 对每个键,检查
a[key]和b[key]是否为同类型(比如都是对象或都是基本类型) - 如果是对象,递归调用比对函数;否则用
===判断基本值
用 Array.isArray() 区分数组与普通对象
数组也是对象,但比对逻辑不同:需按索引顺序逐项比对,而非按键名。在递归入口处加一层判断:
- 若两者都是数组,用
every((_, i) => deepEqual(a[i], b[i]))检查每一项 - 若其中一个是数组、另一个不是,直接返回
false - 注意:不能只靠
typeof,必须用Array.isArray()
用 Object.values() 或 Object.entries() 简化嵌套遍历
比起手动写 for...in,用 Object.entries(obj) 得到 [[key, value], ...] 数组后,可链式调用 every() 或 map():
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Object.entries(a).every(([k, v]) => deepEqual(v, b[k]))更直观地表达“每一对键值都匹配” - 如果需要同时校验键存在性,建议仍优先用
Object.keys()+ 双向every(即检查 a 的键都在 b 里,且 b 的键都在 a 里) - 避免遗漏
hasOwnProperty判断——除非你明确要包含原型链属性
处理特殊值:null、NaN、Date、RegExp 等
纯数组方法无法覆盖所有 JS 类型,需额外分支处理:
立即学习“Java免费学习笔记(深入)”;
-
a === b可直接捕获null、undefined、相同引用的对象/函数 -
Number.isNaN(a) && Number.isNaN(b)单独处理 NaN(NaN !== NaN) a instanceof Date && b instanceof Date && a.getTime() === b.getTime()- 正则表达式可比对
a.toString() === b.toString()和a.flags === b.flags
不复杂但容易忽略:深度比对的本质是递归 + 类型分发,数组方法只是让“遍历逻辑”更函数式、更少副作用。真正核心在于类型判断和递归出口设计,而不是堆砌数组 API。

















