当前位置:首页 > 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
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

利用js实现

利用js实现

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

js怎么实现异步

js怎么实现异步

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