两个值

function isEqual(value1, value2) {
  // 判断类型是否相同
  if (typeof value1 !== typeof value2) {
    return false;
  }
  // 判断是否为对象
  if (typeof value1 === 'object') {
    // 判断是否为null
    if (value1 === null || value2 === null) {
      return value1 === value2;
    }
    // 判断数组长度是否相同
    if (Array.isArray(value1) && Array.isArray(value2)) {
      if (value1.length !== value2.length) {
        return false;
      }
    }
    // 遍历对象属性
    for (let key in value1) {
      if (!isEqual(value1[key], value2[key])) {
        return false;
      }
    }
    return true;
  }
  // 判断基本类型是否相同
  return Object.is(value1, value2);
}

const value1 = {a: 1, b: {c: 2}};
const value2 = {a: 1, b: {c: 2}};
const value3 = {a: 1, b: {c: 3}};

console.log(isEqual(value1, value2)); // true
console.log(isEqual(value1, value3)); // false

两个对象

function isObjectEqual(obj1, obj2) {
  // 判断类型是否相同
  if (typeof obj1 !== typeof obj2) {
    return false;
  }
  // 判断是否为对象
  if (typeof obj1 === 'object') {
    // 判断是否为null
    if (obj1 === null || obj2 === null) {
      return obj1 === obj2;
    }
    // 判断数组长度是否相同
    if (Array.isArray(obj1) && Array.isArray(obj2)) {
      if (obj1.length !== obj2.length) {
        return false;
      }
    }
    // 遍历对象属性
    for (let key in obj1) {
      if (!isObjectEqual(obj1[key], obj2[key])) {
        return false;
      }
    }
    return true;
  }
  // 判断基本类型是否相同
  return Object.is(obj1, obj2);
}

const obj1 = {a: 1, b: {c: 2}};
const obj2 = {a: 1, b: {c: 2}};
const obj3 = {a: 1, b: {c: 3}};

console.log(isObjectEqual(obj1, obj2)); // true
console.log(isObjectEqual(obj1, obj3)); // false

