当前位置:首页 > JavaScript

js实现equal

2026-02-01 01:23:24JavaScript

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

浅比较(Shallow Equal)

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

js实现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)

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

js实现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

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

注意事项

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

标签: jsequal
分享给朋友:

相关文章

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…