当前位置:首页 > JavaScript

js浅比较实现

2026-02-03 00:26:44JavaScript

浅比较的概念

浅比较(Shallow Comparison)是指比较两个对象或数组的顶层属性或元素是否相等,不递归比较嵌套结构。在JavaScript中,常用于性能优化场景,如React的shouldComponentUpdateReact.memo

js浅比较实现

基本实现方法

function shallowEqual(objA, objB) {
  if (Object.is(objA, objB)) return true;

  if (
    typeof objA !== 'object' ||
    typeof objB !== 'object' ||
    objA === null ||
    objB === null
  ) {
    return false;
  }

  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);

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

  for (let i = 0; i < keysA.length; i++) {
    if (
      !Object.prototype.hasOwnProperty.call(objB, keysA[i]) ||
      !Object.is(objA[keysA[i]], objB[keysA[i]])
    ) {
      return false;
    }
  }

  return true;
}

针对数组的优化版本

function shallowCompareArray(arrA, arrB) {
  if (arrA.length !== arrB.length) return false;

  for (let i = 0; i < arrA.length; i++) {
    if (!Object.is(arrA[i], arrB[i])) {
      return false;
    }
  }

  return true;
}

使用场景示例

React组件优化中使用浅比较:

const MyComponent = React.memo(function MyComponent(props) {
  // 组件内容
}, (prevProps, nextProps) => {
  return shallowEqual(prevProps, nextProps);
});

性能注意事项

  • 浅比较比深比较性能更高,但可能遗漏嵌套结构的变化
  • 对于大型对象,建议配合不可变数据模式使用
  • 比较前可先检查引用相等性快速返回结果

边界情况处理

实现时需考虑以下特殊情况:

// NaN比较
Object.is(NaN, NaN); // true

// +0/-0比较
Object.is(+0, -0); // false

// 原型链属性忽略
const objA = { a: 1 };
const objB = Object.create({ a: 1 });
shallowEqual(objA, objB); // false

以上实现提供了JavaScript中浅比较的核心逻辑,可根据具体需求调整比较策略。

js浅比较实现

标签: js
分享给朋友:

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…