当前位置:首页 > JavaScript

js实现equal

2026-03-13 23:33:23JavaScript

实现 JavaScript 深度比较(equal)

在 JavaScript 中实现深度比较(deep equal)需要递归检查对象的每个属性或数组的每个元素。以下是几种常见方法:

基本值比较

对于基本类型(number, string, boolean, null, undefined, symbol),直接使用 === 进行比较:

if (a === b) return true;

日期对象比较

日期对象需要转换为时间戳进行比较:

if (a instanceof Date && b instanceof Date) {
  return a.getTime() === b.getTime();
}

正则表达式比较

正则表达式需要比较其模式和标志:

if (a instanceof RegExp && b instanceof RegExp) {
  return a.source === b.source && a.flags === b.flags;
}

对象和数组比较

对于对象和数组,需要递归比较每个属性或元素:

function deepEqual(a, b) {
  if (a === b) return true;

  if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
    return false;
  }

  const keysA = Object.keys(a);
  const keysB = Object.keys(b);

  if (keysA.length !== keysB.length) return false;

  for (const key of keysA) {
    if (!keysB.includes(key)) return false;
    if (!deepEqual(a[key], b[key])) return false;
  }

  return true;
}

完整实现示例

function deepEqual(a, b) {
  if (a === b) return true;

  if (a instanceof Date && b instanceof Date) {
    return a.getTime() === b.getTime();
  }

  if (a instanceof RegExp && b instanceof RegExp) {
    return a.source === b.source && a.flags === b.flags;
  }

  if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
    return false;
  }

  const keysA = Object.keys(a);
  const keysB = Object.keys(b);

  if (keysA.length !== keysB.length) return false;

  for (const key of keysA) {
    if (!keysB.includes(key)) return false;
    if (!deepEqual(a[key], b[key])) return false;
  }

  return true;
}

使用现成库

对于生产环境,推荐使用成熟的库如 Lodash 的 _.isEqual

js实现equal

const _ = require('lodash');
_.isEqual(object1, object2);

注意事项

  • 循环引用会导致栈溢出,需要额外处理
  • 函数比较通常返回 false,除非是同一引用
  • Symbol 作为属性名时需要特殊处理
  • 原型链上的属性不会被比较

标签: jsequal
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现投球

js实现投球

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…