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