当前位置:首页 > 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组件优化中使用浅比较:

js浅比较实现

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

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…