当前位置:首页 > JavaScript

js实现equal

2026-02-01 01:23:24JavaScript

在JavaScript中实现深度比较(equal)功能,可以通过以下方法实现。根据比较需求的不同,可分为浅比较和深比较两种场景:

浅比较(Shallow Equal)

浅比较仅检查基本类型值或对象的引用是否相同,适用于简单对象或数组:

function shallowEqual(obj1, obj2) {
  if (obj1 === obj2) return true;
  if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {
    return false;
  }
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  if (keys1.length !== keys2.length) return false;
  for (let key of keys1) {
    if (obj1[key] !== obj2[key]) return false;
  }
  return true;
}

深比较(Deep Equal)

深比较会递归检查所有嵌套属性和值,适用于复杂对象或数组:

function deepEqual(obj1, obj2) {
  if (obj1 === obj2) return true;
  if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {
    return false;
  }
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  if (keys1.length !== keys2.length) return false;
  for (let key of keys1) {
    if (!deepEqual(obj1[key], obj2[key])) return false;
  }
  return true;
}

特殊场景处理

处理特殊对象如DateRegExp等:

function deepEqualWithSpecialTypes(obj1, obj2) {
  if (obj1 === obj2) return true;
  if (obj1 instanceof Date && obj2 instanceof Date) return obj1.getTime() === obj2.getTime();
  if (obj1 instanceof RegExp && obj2 instanceof RegExp) return obj1.toString() === obj2.toString();
  if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {
    return false;
  }
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  if (keys1.length !== keys2.length) return false;
  for (let key of keys1) {
    if (!deepEqualWithSpecialTypes(obj1[key], obj2[key])) return false;
  }
  return true;
}

使用现成库

推荐使用现成工具库如lodash_.isEqual

js实现equal

const _ = require('lodash');
const isEqual = _.isEqual(obj1, obj2);

注意事项

  • 循环引用会导致递归爆栈,需额外处理(如使用WeakMap记录已比较对象)。
  • 性能敏感场景建议使用浅比较或限制递归深度。
  • 符号(Symbol)属性需通过Object.getOwnPropertySymbols()单独处理。

标签: jsequal
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码 funct…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…