我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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中的浅比较是怎么工作的”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

React中Hooks是如何工作的

React中Hooks是如何工作的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. React Hooks VS 纯函数React Hook 说白了就是 Re
2023-06-15

css中的比较函数怎么使用

今天小编给大家分享一下css中的比较函数怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Clamp(), Max(),
2023-07-04

php中怎么只比较数组的值

这篇文章主要介绍“php中怎么只比较数组的值”,在日常操作中,相信很多人在php中怎么只比较数组的值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中怎么只比较数组的值”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

Keras中EarlyStopping是怎么工作的

Keras中的EarlyStopping是一种回调函数,它可以在训练过程中监控模型的性能,并根据一些指定的条件来停止训练。EarlyStopping会在每个epoch结束时计算模型在验证集上的性能,并将其与之前的性能进行比较。如果模型在连续
Keras中EarlyStopping是怎么工作的
2024-03-14

jquery中的比较方法怎么使用

本文小编为大家详细介绍“jquery中的比较方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery中的比较方法怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述比较是Web应用程序中最常
2023-07-05

mysql中datetime比较大小的方法是什么

在MySQL中,可以使用比较运算符(如、=、=)来比较两个datetime数据的大小。比较的结果将返回一个布尔值,表示比较结果的真假。以下是一些示例:比较两个datetime类型的列:SELECT * FROM table
mysql中datetime比较大小的方法是什么
2024-04-09

python怎么比较数组中数的大小

在 Python 中,可以使用内置的 `max()` 和 `min()` 函数来比较数组中数的大小。这两个函数分别返回数组中的最大值和最小值。以下是使用示例:```python# 定义一个数组arr = [5, 10, 3, 8, 2]#
2023-09-29

Tomcat中Request Processor是怎么工作的

在Tomcat中,Request Processor是负责处理HTTP请求的组件。当一个HTTP请求到达Tomcat服务器时,Request Processor会接收并处理该请求。它的工作流程通常包括以下几个步骤:接收请求:Request
Tomcat中Request Processor是怎么工作的
2024-03-08

php中怎么比较字符串的异同

php中怎么比较字符串的异同,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
2023-06-20

vbscript 中怎么比较三个数的大小

今天就跟大家聊聊有关vbscript 中怎么比较三个数的大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码如下:dim a,b,c a =inputbox ("请输入0-99的整
2023-06-08

CDN是怎么工作的

CDN(内容传送网络)是一种互联网基础设施,用于加速内容传送和提高网站的性能。CDN工作的基本原理是通过将内容存储在分布在全球各地的服务器中,当用户请求访问网站上的内容时,CDN会自动将内容从距离用户最近的服务器上提取并传送给用户,从而减少
CDN是怎么工作的
2024-04-24

chatgpt是怎么工作的

本篇内容主要讲解“chatgpt是怎么工作的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“chatgpt是怎么工作的”吧!chatgpt的原理ChatGPT是一个基于网络的、支持多协议的、使用
chatgpt是怎么工作的
2023-02-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录