# 一. 基础
在 JavaScript 中,对于深度比较,如果是基本数据类型,可以通过===便可完成实现。而对于引用数据类型,就要麻烦许多,由于栈空间中仅保存引用数据类型在堆空间中位置的地址指针(此处涉及到栈空间和堆空间),所以无法使用===进行比较。此时,便只能设计专门的函数进行引用数据类型的深度比较。
# 二. 实现
# 1. 思路
深度比较两个对象,就是要深度比较对象的每一个元素(递归)
# 2. 代码
// 判断是否是对象
function isObject(obj) {
return typeof obj === "object" && obj !== null;
}
// 判断是否全相等
function isEqual(obj1, obj2) {
// 首先判断是否是对象,值类型可以直接比较
if (!isObject(obj1) || !isObject(obj2)) {
return obj1 === obj2;
}
// 1.直接比较内存地址
if (obj1 === obj2) return true;
// 若内存地址不相同,则进行深度比较
// 2.比较key个数
const obj1Keys = Object.keys(obj1);
const obj2Keys = Object.keys(obj2);
if (obj1Keys.length !== obj2Keys.length) return false;
// 3.个数相同,以obj1为基准,递归比较
for (let key in obj1) {
const res = isEqual(obj1[key], obj2[key]);
if (!res) return false;
}
// 4.满足以上条件,全相等
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30