# 一. 基础

在 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