iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React中的浅比较是怎么工作的
  • 482
分享到

React中的浅比较是怎么工作的

2023-06-30 10:06:23 482人浏览 薄情痞子
摘要

这篇文章主要介绍了React中的浅比较是怎么工作的的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中的浅比较是怎么工作的文章都会有所收获,下面我们一起来看看吧。想要理解浅比较的概念,最直接的方法就是研究

这篇文章主要介绍了React中的浅比较是怎么工作的的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中的浅比较是怎么工作的文章都会有所收获,下面我们一起来看看吧。

想要理解浅比较的概念,最直接的方法就是研究React的源代码,下面就来看看React中的shallowEqual.js 文件:

import is from './objectIs';import hasOwnProperty from './hasOwnProperty';function shallowEqual(objA: mixed, objB: mixed): boolean {  if (is(objA, objB)) {    return true;  }  if (    typeof objA !== 'object' ||    objA === null ||    typeof objB !== 'object' ||    objB === null  ) {    return false;  }  const keysA = Object.keys(objA);  const keysB = Object.keys(objB);  if (keysA.length !== keysB.length) {    return false;  }    // Test for A's keys different from B.  for (let i = 0; i < keysA.length; i++) {    const currenTKEy = keysA[i];    if (      !hasOwnProperty.call(objB, currentKey) ||      !is(objA[currentKey], objB[currentKey])    ) {      return false;    }  }  return true;}

这里执行了很多步操作,下面就来将其拆分并逐步执行这些功能。先来看看函数的定义,这个函数接受两个需要比较的对象,这里的代码使用 Flow 作为类型检查系统。两个函数参数都是使用特殊的混合 Flow 类型定义,类似于 typescript 的 unknown,它表明函数可以是任何类型的值。

function shallowEqual(objA: mixed, objB: mixed): boolean {    // ...}

之后使用 React 内部对象的 is 函数将两个函数参数进行比较。导入的 is 函数只不过是javascript 的 Object.is 函数的polyfill 版本。 这个比较函数基本上等同于常见的 === 运算符,但有两个例外:

  • Object.is 认为 +0 和 -0 不相等,而 === 认为它们相等;

  • Object.is 认为 Number.NaN 和 NaN 相等,而 === 认为它们不相等。

基本上,第一个条件语句可以处理所有简单的情况:如果两个函数参数具有相同的值,对于原始类型,或引用相同的对象(数组和对象),那么通过浅比较认为它们相等的。

import is from './objectIs';function shallowEqual(objA: mixed, objB: mixed): boolean {  if (is(objA, objB)) {    return true;  }    // ...}

在处理两个函数参数值相等或者引用同一个对象的所有简单情况之后,来看看更复杂的结构:数组和对象。
为了确保现在要处理的是两个复杂的结构,代码会检查任一参数是不是object类型或者等于null,前者用来确保我们处理的数组或对象,后者用来过滤掉空值,因为typeof null的结果也是 object。如果任何一个条件成立,那两个参数一定是不相等的(否则前面的条件语句就会将它们过滤掉),因此浅比较直接返回false。

function shallowEqual(objA: mixed, objB: mixed): boolean {    // ...  if (    typeof objA !== 'object' ||    objA === null ||    typeof objB !== 'object' ||    objB === null  ) {    return false;  }    // ...}

现在就可以确保我们处理的是数组和对象了,接下来我们深入研究复杂数据结构的值,并在两个函数参数之间进行比较。在此之前,先来检查两个参数中值的数量是否相等,如果不相等,直接就可以确定两个值是不相等的。对于对象,得到的keys数组就是由实际的key组成的;对于数组,得到keys数组数是由字符串类型的数组索引组成的。

function shallowEqual(objA: mixed, objB: mixed): boolean {    // ...  const keysA = Object.keys(objA);  const keysB = Object.keys(objB);  if (keysA.length !== keysB.length) {    return false;  }    // ...}

最后一步,按照 key 来迭代两个函数参数的值,并逐个验证他们是否是相等的。为此,代码使用到了上一步中生成的keys数组,使用 hasOwnProperty 检查key是否实际上是参数的属性,并使用 Object.is 函数进行比较。

import hasOwnProperty from './hasOwnProperty';function shallowEqual(objA: mixed, objB: mixed): boolean {    // ...  // Test for A's keys different from B.  for (let i = 0; i < keysA.length; i++) {    const currentKey = keysA[i];    if (      !hasOwnProperty.call(objB, currentKey) ||      !is(objA[currentKey], objB[currentKey])    ) {      return false;    }  }  return true;}

如果任何两个key对应的值是不相等的,那两个对象肯定就是不相等的,因此直接人会false,结束循环。如果所有的值都是相等的,就返回 true。

至此,我们通过 React 源码学习了 React 中的浅比较,下面来总结一下其中有趣的知识吧:

  • 浅比较使用的是 Object.is 函数,而不是使用严格相等 === 运算符;

  • 通过浅比较,空对象和空数组是等价的;

  • 通过浅比较,以数组索引为 key 和数组值为value的对象是等价的,比如:{ 0: 2, 1: 3 } 等价于 [2, 3];

  • 由于通过Object.is比较的+0 和 -0、Number.NaN 和 NaN是不相等的,所以在复杂结构中比较时,这也是适用的;

  • 虽然{} 和 [] 钱比较是相等的,但是嵌套在对象中对象是不相等的,比如:{ someKey: {} } 和 { someKey: [] } 是不相等的。

关于“React中的浅比较是怎么工作的”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“React中的浅比较是怎么工作的”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: React中的浅比较是怎么工作的

本文链接: https://www.lsjlt.com/news/328194.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React中的浅比较是怎么工作的
    这篇文章主要介绍了React中的浅比较是怎么工作的的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中的浅比较是怎么工作的文章都会有所收获,下面我们一起来看看吧。想要理解浅比较的概念,最直接的方法就是研究...
    99+
    2023-06-30
  • 浅谈React中的浅比较是如何工作的
    React 中浅比较的概念无处不在,它在不同的流程中起着关键的作用,也可以在React组件的多个生命周期中找到。比如,React Hooks中的依赖数组,通过React.memo进行...
    99+
    2024-04-02
  • 详解React中Props的浅对比
    目录类组件的Props对比 shallowEqual 浅对比函数组件的浅对比 上一周去面试的时候,面试官我PureComponent里是如何对比props的,概念已经牢记脑中,脱口而...
    99+
    2024-04-02
  • React中Hooks是如何工作的
    React中Hooks是如何工作的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. React Hooks VS 纯函数React Hook 说白了就是 Re...
    99+
    2023-06-15
  • 浅谈java中HashMap键的比较方式
    先看一个例子 Integer integer=12344; Integer integer1=12344; 在Java中Integer 和Integer1是不相等的,但是...
    99+
    2024-04-02
  • VBS中比较运算符的作用
    本篇内容主要讲解“VBS中比较运算符的作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“VBS中比较运算符的作用”吧!比较运算符用于比较表达式。result = expression1 comp...
    99+
    2023-06-08
  • 详解React Hooks是如何工作的
    目录1. React Hooks VS 纯函数2. 简单 myUseState3. 改进 myUseState4. 实现原理引发的 Hooks 规则1. React Hooks VS...
    99+
    2024-04-02
  • Flume中Source是怎么工作的
    Flume中的Source负责从不同的数据源(如日志文件、网络端口、数据库等)获取数据,并将数据传递给Flume的Channel。S...
    99+
    2024-04-02
  • Keras中EarlyStopping是怎么工作的
    Keras中的EarlyStopping是一种回调函数,它可以在训练过程中监控模型的性能,并根据一些指定的条件来停止训练。Early...
    99+
    2024-03-14
    Keras EarlyStopping
  • 浅谈java自定义中类两个对象的比较
    目录 实现比较两个对象是否相同 1.前置代码 1.学生类 2.示例  3.输出  4.原因 2.那么我们要怎么做呢 1.对Student类中重新实现quals方法(即对equals方法重写)  2.完整代码如下: 3.具体操作 4.演示 ...
    99+
    2023-09-20
    java 开发语言 学习 学习方法 程序人生 intellij-idea
  • 比较全面的MySQL优化是怎么样的
    本篇文章给大家分享的是有关比较全面的MySQL优化是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、硬件层相关优化  1.1、CPU...
    99+
    2024-04-02
  • react中key的作用是什么
    本文小编为大家详细介绍“react中key的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react中key的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • 浅谈Android中AsyncTask的工作原理
    目录概述AsyncTask使用方法AsyncTask的4个核心方法AsyncTask的工作原理概述 实际上,AsyncTask内部是封装了Thread和Handler。虽然Async...
    99+
    2024-04-02
  • sqlserver中怎么比较两个表的列
    今天就跟大家聊聊有关sqlserver中怎么比较两个表的列,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、问题 给了两个各有四五十个列的表,找出他...
    99+
    2024-04-02
  • javascript中的等值比较怎么理解
    本篇内容介绍了“javascript中的等值比较怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • php中怎么只比较数组的值
    这篇文章主要介绍“php中怎么只比较数组的值”,在日常操作中,相信很多人在php中怎么只比较数组的值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中怎么只比较数组的值”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • jquery中的比较方法怎么使用
    本文小编为大家详细介绍“jquery中的比较方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery中的比较方法怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述比较是Web应用程序中最常...
    99+
    2023-07-05
  • css中的比较函数怎么使用
    今天小编给大家分享一下css中的比较函数怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Clamp(), Max(),...
    99+
    2023-07-04
  • CDN是怎么工作的
    CDN(内容传送网络)是一种互联网基础设施,用于加速内容传送和提高网站的性能。CDN工作的基本原理是通过将内容存储在分布在全球各地的...
    99+
    2024-04-24
    CDN
  • Tomcat中Request Processor是怎么工作的
    在Tomcat中,Request Processor是负责处理HTTP请求的组件。当一个HTTP请求到达Tomcat服务器时,Req...
    99+
    2024-03-08
    Tomcat
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作