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