前言
在JavaScript中,对于深度比较,如果是基本数据类型,可以通过===
便可完成实现。而对于引用数据类型,就要麻烦许多,由于栈空间中仅保存引用数据类型在堆空间中位置的地址指针(此处涉及到栈空间和堆空间,你是否了解该知识点呢?嘻嘻嘻),所以无法使用===
进行比较。此时,便只能设计专门的函数进行引用数据类型的深度比较。
思路
核心思想:深度比较两个对象,就是要深度比较对象的每一个元素。=> 递归
具体实现
function isObject(obj) {//判断obj是否为对象
return typeof obj === 'object' && obj != null
}
function deepCompare(obj1, obj2) {//深度比较函数
// 1.有一个或两个都不是对象
if (!isObject(obj1) || !isObject(obj2)) {
return obj1 === obj2
}
// 2.同一个对象
if (obj1 === obj2) {
return true
}
// 3.不是同一个对象
const obj1Keys = Object.keys(obj1)
const obj2Keys = Object.keys(obj2)
// 3.1键数量不一样
if (obj1Keys.length != obj2Keys.length) {
return false
}
// 3.2键数量一样
for (let key in obj1) {
const res = deepCompare(obj1[key], obj2[key])//递归深度比较对象的每一个键值对
if (!res) {//只要有一个键值对不相等,则两个对象就不相等
return false
}
}
return true
}