最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談React 中的淺比較是如何工作的

 更新時間:2022年04月26日 15:26:49   作者:CUGGZ  
React 中淺比較的概念無處不在,它在不同的流程中起著關(guān)鍵的作用,本文主要介紹了React 中的淺比較是如何工作的,具有一定的參考價值,感興趣的可以了解一下

React 中淺比較的概念無處不在,它在不同的流程中起著關(guān)鍵的作用,也可以在React組件的多個生命周期中找到。比如,React Hooks中的依賴數(shù)組,通過React.memo進(jìn)行記憶。在React的官方文檔中也多次提到“淺比較”這個概念,下面我們就來看看React中的淺比較是如何工作的!

想要理解淺比較的概念,最直接的方法就是研究React的源代碼,下面就來看看React中的shallowEqual.js 文件:

import is from './objectIs';
import hasOwnProperty from './hasOwnProperty';

/**
?* Performs equality by iterating through keys on an object and returning false
?* when any key has values which are not strictly equal between the arguments.
?* Returns true when the values of all keys are strictly equal.
?*/
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;
}

這里執(zhí)行了很多步操作,下面就來將其拆分并逐步執(zhí)行這些功能。先來看看函數(shù)的定義,這個函數(shù)接受兩個需要比較的對象,這里的代碼使用 Flow 作為類型檢查系統(tǒng)。兩個函數(shù)參數(shù)都是使用特殊的混合 Flow 類型定義,類似于 TypeScript 的 unknown,它表明函數(shù)可以是任何類型的值。

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

之后使用 React 內(nèi)部對象的 is 函數(shù)將兩個函數(shù)參數(shù)進(jìn)行比較。導(dǎo)入的 is 函數(shù)只不過是JavaScript 的 Object.is 函數(shù)的polyfill 版本。 這個比較函數(shù)基本上等同于常見的 === 運(yùn)算符,但有兩個例外:

  • Object.is 認(rèn)為 +0 和 -0 不相等,而 === 認(rèn)為它們相等;
  • Object.is 認(rèn)為 Number.NaN 和 NaN 相等,而 === 認(rèn)為它們不相等。

基本上,第一個條件語句可以處理所有簡單的情況:如果兩個函數(shù)參數(shù)具有相同的值,對于原始類型,或引用相同的對象(數(shù)組和對象),那么通過淺比較認(rèn)為它們相等的。

import is from './objectIs';

function shallowEqual(objA: mixed, objB: mixed): boolean {
? if (is(objA, objB)) {
? ? return true;
? }
?? ?// ...
}

在處理兩個函數(shù)參數(shù)值相等或者引用同一個對象的所有簡單情況之后,來看看更復(fù)雜的結(jié)構(gòu):數(shù)組和對象。
為了確?,F(xiàn)在要處理的是兩個復(fù)雜的結(jié)構(gòu),代碼會檢查任一參數(shù)是不是object類型或者等于null,前者用來確保我們處理的數(shù)組或?qū)ο?,后者用來過濾掉空值,因?yàn)閠ypeof null的結(jié)果也是 object。如果任何一個條件成立,那兩個參數(shù)一定是不相等的(否則前面的條件語句就會將它們過濾掉),因此淺比較直接返回false。

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

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

?? ?// ...
}

現(xiàn)在就可以確保我們處理的是數(shù)組和對象了,接下來我們深入研究復(fù)雜數(shù)據(jù)結(jié)構(gòu)的值,并在兩個函數(shù)參數(shù)之間進(jìn)行比較。在此之前,先來檢查兩個參數(shù)中值的數(shù)量是否相等,如果不相等,直接就可以確定兩個值是不相等的。對于對象,得到的keys數(shù)組就是由實(shí)際的key組成的;對于數(shù)組,得到keys數(shù)組數(shù)是由字符串類型的數(shù)組索引組成的。

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 來迭代兩個函數(shù)參數(shù)的值,并逐個驗(yàn)證他們是否是相等的。為此,代碼使用到了上一步中生成的keys數(shù)組,使用 hasOwnProperty 檢查key是否實(shí)際上是參數(shù)的屬性,并使用 Object.is 函數(shù)進(jìn)行比較。

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對應(yīng)的值是不相等的,那兩個對象肯定就是不相等的,因此直接人會false,結(jié)束循環(huán)。如果所有的值都是相等的,就返回 true。

至此,我們通過 React 源碼學(xué)習(xí)了 React 中的淺比較,下面來總結(jié)一下其中有趣的知識吧:

  • 淺比較使用的是 Object.is 函數(shù),而不是使用嚴(yán)格相等 === 運(yùn)算符;
  • 通過淺比較,空對象和空數(shù)組是等價的;
  • 通過淺比較,以數(shù)組索引為 key 和數(shù)組值為value的對象是等價的,比如:{ 0: 2, 1: 3 } 等價于 [2, 3];
  • 由于通過Object.is比較的+0 和 -0、Number.NaN 和 NaN是不相等的,所以在復(fù)雜結(jié)構(gòu)中比較時,這也是適用的;
  • 雖然{} 和 [] 錢比較是相等的,但是嵌套在對象中對象是不相等的,比如:{ someKey: {} } 和 { someKey: [] } 是不相等的。

源碼:https://github.com/facebook/react/blob/main/packages/shared/shallowEqual.js

到此這篇關(guān)于淺談React 中的淺比較是如何工作的的文章就介紹到這了,更多相關(guān)React 淺比較內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react native 文字輪播的實(shí)現(xiàn)示例

    react native 文字輪播的實(shí)現(xiàn)示例

    這篇文章主要介紹了react native 文字輪播的實(shí)現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • React實(shí)現(xiàn)分頁效果

    React實(shí)現(xiàn)分頁效果

    這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)分頁效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 基于React路由跳轉(zhuǎn)的幾種方式

    基于React路由跳轉(zhuǎn)的幾種方式

    這篇文章主要介紹了React路由跳轉(zhuǎn)的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • React-Native 環(huán)境搭建和基本介紹

    React-Native 環(huán)境搭建和基本介紹

    這篇文章主要介紹了React-Native 環(huán)境搭建和基本介紹的相關(guān)資料,包括react native優(yōu)缺點(diǎn),通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-04-04
  • React項(xiàng)目中hook實(shí)現(xiàn)展示對話框功能

    React項(xiàng)目中hook實(shí)現(xiàn)展示對話框功能

    Modal(模態(tài)框)是 web 開發(fā)中十分常見的組件,即從頁面中彈出的對話框,下面這篇文章主要給大家介紹了關(guān)于React項(xiàng)目中hook實(shí)現(xiàn)展示對話框功能的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • React循環(huán)遍歷渲染數(shù)組和對象元素方式

    React循環(huán)遍歷渲染數(shù)組和對象元素方式

    這篇文章主要介紹了React循環(huán)遍歷渲染數(shù)組和對象元素方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • react中Suspense的使用詳解

    react中Suspense的使用詳解

    這篇文章主要介紹了react中Suspense的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • React模擬實(shí)現(xiàn)Vue的keepAlive功能

    React模擬實(shí)現(xiàn)Vue的keepAlive功能

    Vue中,keep-alive組件可以緩存組件狀態(tài),在路由切換時重新掛載,實(shí)現(xiàn)這一功能在React中并不簡單,但我們可以借助一個第三方庫——react-activation 來模擬Vue的keep-alive功能,需要的朋友可以參考下
    2024-10-10
  • React實(shí)現(xiàn)合成事件的源碼分析

    React實(shí)現(xiàn)合成事件的源碼分析

    React?中的事件,是對原生事件的封裝,叫做合成事件。抽象出一層合成事件,是為了做兼容,抹平不同瀏覽器之間的差異。本文將從事件綁定和事件觸發(fā)角度,帶大家解讀下源碼,感興趣的可以了解一下
    2022-12-12
  • React?Native實(shí)現(xiàn)Toast輕提示和loading效果

    React?Native實(shí)現(xiàn)Toast輕提示和loading效果

    這篇文章主要介紹了React Native實(shí)現(xiàn)Toast輕提示和loading效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

郴州市| 稻城县| 云浮市| 灵寿县| 大兴区| 张北县| 平山县| 东源县| 赞皇县| 太康县| 贵定县| 连江县| 观塘区| 余江县| 铜鼓县| 花莲市| 大洼县| 河西区| 云和县| 南阳市| 满城县| 封丘县| 额济纳旗| 思南县| 如东县| 平江县| 西丰县| 瑞昌市| 长宁县| 华阴市| 松江区| 乐平市| 五台县| 台南县| 南昌市| 宁都县| 金乡县| 沙坪坝区| 灵石县| 镇沅| 东丰县|