使用 JavaScript 中的類型運(yùn)算符自定義淺比較() 和深度比較 () 的實(shí)現(xiàn)。
Deep/與運(yùn)算符類型的淺比較
嗨,伙計(jì)們,今天我將向您展示如何使用自定義 typeof 運(yùn)算符為淺副本和深層副本編寫(xiě)自定義實(shí)現(xiàn)。讓我們開(kāi)始吧。
首先,我們需要知道什么是淺層和深層比較。當(dāng)我們?cè)诓稍L中被問(wèn)到時(shí),這些術(shù)語(yǔ)非常令人生畏,但是一旦你了解了JavaScript運(yùn)行時(shí)環(huán)境,它們的含義就變得非常簡(jiǎn)單。
讓我告訴你,在JavaScript中,基元類型和非基元類型之間的比較在某些部分非常令人困惑,但是如果你確切地知道JavaScript中原始類型和非原始類型之間的區(qū)別,那么這些將很容易回答并向其他人解釋。
什么是原始類型和非基元類型?
基元數(shù)據(jù)類型是不是任何對(duì)象且不附加任何屬性或方法的數(shù)據(jù)類型。
有 7 種基元數(shù)據(jù)類型:
字符串
數(shù)
比金特
布爾
定義
象征
零
與基元數(shù)據(jù)類型相關(guān)的一個(gè)要點(diǎn)是所有基元都是不可變的;也就是說(shuō),它們不能被改變。
非基元數(shù)據(jù)類型稱為導(dǎo)數(shù)(引用類型),這意味著它僅從基元數(shù)據(jù)類型派生。
陣 列
對(duì)象
現(xiàn)在,我們對(duì)什么是基元數(shù)據(jù)類型和參考數(shù)據(jù)類型有了一點(diǎn)了解,接下來(lái)讓我們繼續(xù)討論深度和淺層比較的主題。
1. 淺比較()
淺層比較是一種檢查兩個(gè)值是否相等的比較類型。它應(yīng)該在一個(gè)級(jí)別上進(jìn)行檢查,這意味著嵌套對(duì)象引用尚未準(zhǔn)備好進(jìn)行比較,只允許在基元數(shù)據(jù)和非基元數(shù)據(jù)類型之間進(jìn)行一個(gè)級(jí)別的比較。
第一級(jí)的淺層比較
此圖指出,如果發(fā)生淺層比較,則應(yīng)在一個(gè)級(jí)別上正確發(fā)生,而不是在嵌套級(jí)別。
不允許對(duì)嵌套參照進(jìn)行淺層比較
在我們進(jìn)入淺層比較的自定義實(shí)現(xiàn)之前,我們需要再做一個(gè)類型運(yùn)算符的自定義實(shí)現(xiàn)(內(nèi)置的JavaScript方法) - 您可以使用運(yùn)算符 來(lái)查找JavaScript變量的數(shù)據(jù)類型。typeof
內(nèi)置運(yùn)算符類型
**我認(rèn)為JavaScript中的一個(gè)主要缺點(diǎn)或陷阱是它將返回所有引用類型的對(duì)象類型,例如數(shù)組,對(duì)象,日期,null等。
因此,如果您需要知道它是數(shù)組還是對(duì)象,則是不可能的。它總是返回一個(gè)非常令人困惑的對(duì)象,但畢竟,它是由JavaScript人員設(shè)計(jì)的,請(qǐng)記住,由于其在JavaScript中動(dòng)態(tài)類型的性質(zhì),數(shù)組被視為一個(gè)對(duì)象。
因此,為了實(shí)現(xiàn)展示它是數(shù)組、對(duì)象還是日期的功能,我們需要編寫(xiě)自定義 typeof 運(yùn)算符。
讓我告訴你它是什么樣子的:
自定義實(shí)現(xiàn) — 運(yùn)算符類型
自定義類型操作員
現(xiàn)在,我們獲取傳遞的引用數(shù)據(jù)類型的確切類型,無(wú)論是數(shù)組、對(duì)象還是日期。
在進(jìn)行任何進(jìn)一步的延遲之前,讓我們專注于淺層比較。
自定義實(shí)現(xiàn) — 淺比較()
在此實(shí)現(xiàn)中,我們使用自定義 typeof 運(yùn)算符來(lái)檢查它是數(shù)組、對(duì)象、日期還是其他內(nèi)容。此函數(shù)僅在一個(gè)級(jí)別執(zhí)行淺層比較,而不在嵌套級(jí)別上執(zhí)行淺層比較。讓我們看一個(gè)例子:
2. 深度比較()
深度比較是一種比較類型,它檢查兩個(gè)值是否相等,它應(yīng)該在所有級(jí)別上進(jìn)行檢查,這意味著嵌套對(duì)象引用已準(zhǔn)備好進(jìn)行比較。在嵌套對(duì)象、數(shù)組等上測(cè)試深度比較。
自定義實(shí)現(xiàn) — deepCompare()
深度比較
只有一點(diǎn)需要注意的是,在深度比較中,由于在多級(jí)或嵌套級(jí)進(jìn)行比較,您需要對(duì)同一函數(shù)進(jìn)行遞歸調(diào)用。由于我們有嵌套對(duì)象和數(shù)組,我們需要在多個(gè)級(jí)別上檢查它們。
而且,由于遞歸調(diào)用,深度比較與淺層比較相對(duì)較慢。
讓我們看看這些例子:
深度比較示例
因此,我們已經(jīng)了解了 JavaScript 中類型運(yùn)算符、淺比較() 和深度比較() 函數(shù)的自定義實(shí)現(xiàn),以及如何使用它們?cè)诨獢?shù)據(jù)類型和非基元數(shù)據(jù)類型之間工作和比較。
在自定義實(shí)現(xiàn)的后續(xù)部分中,我們將看到更多的自定義實(shí)現(xiàn),這將幫助您了解幕后發(fā)生的情況。請(qǐng)繼續(xù)關(guān)注更多!