You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中是否存在无需外部库的更优对象深度比较方案?

JavaScript 原生更优对象比较方法探讨

问题背景

想了解JavaScript中是否存在更优的对象比较方法,要求不依赖外部库、可借助较新API实现,同时明确是否目前尚无更好方案。

基础代码示例

const a = {value: 'foo'};
const b = {value: 'foo'};

function isEqual(obj1, obj2) {
 // 仅修改此函数,需返回布尔值
 return // TODO
}

现有方案的局限

  1. 全等运算符===:仅比较内存引用,无法判断内容相同的不同对象:
function isEqual(obj1, obj2) {
 return obj1 === obj2;
}
console.log(isEqual(a, b)); // false
  1. JSON.stringify序列化比较:能判断简单对象内容,但存在诸多缺陷:
function isEqual(obj1, obj2) {
 return JSON.stringify(obj1) === JSON.stringify(obj2);
}
console.log(isEqual(a, b)); // true

缺陷包括:

  • 属性顺序不同的对象会被判定为不等(如{a:1, b:2}和{b:2, a:1})
  • 无法处理循环引用对象,直接抛出错误
  • 对undefined、NaN、Infinity等特殊值处理不一致(undefined属性会被忽略,NaN/Infinity被序列化为null)

现代JavaScript的解决方案

目前JavaScript标准库没有原生的深对象比较API,但可以借助现代JS特性实现更可靠的轻量比较方法,无需外部库:

基于现代API的实现示例

function isEqual(obj1, obj2) {
  // 引用相同直接返回true
  if (obj1 === obj2) return true;

  // 处理null/undefined边界情况
  if (obj1 == null || obj2 == null) return false;

  // 类型不一致直接返回false
  if (typeof obj1 !== typeof obj2) return false;

  // 数组深比较
  if (Array.isArray(obj1)) {
    if (obj1.length !== obj2.length) return false;
    return obj1.every((item, index) => isEqual(item, obj2[index]));
  }

  // 对象深比较
  if (typeof obj1 === 'object') {
    const keys1 = Object.keys(obj1);
    const keys2 = Object.keys(obj2);
    // 键数量不同直接返回false
    if (keys1.length !== keys2.length) return false;
    // 遍历所有键,递归比较值
    return keys1.every(key => {
      if (!Object.hasOwn(obj2, key)) return false;
      return isEqual(obj1[key], obj2[key]);
    });
  }

  // 基本类型直接比较
  return obj1 === obj2;
}

该实现的优势

  • 支持对象和数组的深比较
  • 处理了null/undefined、类型不一致等边界情况
  • 使用现代APIObject.hasOwn替代hasOwnProperty,避免原型链污染问题
  • 支持属性顺序不同但键值对一致的对象比较

扩展说明

如果需要处理日期、正则表达式、Map/Set等特殊类型,可在函数中增加对应类型的判断逻辑(比如比较日期的时间戳、正则的源和标志位等),上述实现可覆盖大多数普通对象和数组的比较需求。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:07:38