首頁 > 科技

javascript中的深拷貝和淺拷貝

2021-07-16 03:04:57

資料複製是我們程式設計中經常會使用到的技術,對於普通數值資料來說,複製很簡單,但是對於複雜類型比如物件的複製,就會有很多需要考慮的東西,比如我們經常說到的深拷貝和淺拷貝。

01淺拷貝

複製的物件和原始物件屬性相關聯。事實上,如果物件的任何欄位被其他物件引用,則它們共享相同的記憶體地址

02深拷貝

與淺拷貝不同,深拷貝複製物件的所有屬性,並且為新物件分配新的記憶體地址,我們對新物件的操作不會影響到原物件,看起來就像是將原物件所有的東西都重新複製出來一份。

03資料類型

JavaScript中的資料類型分為原始資料類型和複合資料類型。

數值,字元串,布爾值,undefined,null為原始資料類型,而陣列和物件則是複合類型。

原始資料進行復制克隆的時候,永遠都是新的副本,不會和原來資料進行關聯,而複合資料進行淺拷貝的時候,只是分配值的引用。

04創建深拷貝

對於克隆物件,如果我們想要進行深拷貝,那麼我們經常使用的方法就是JSON.parse()和JSON.stringify()。

05陣列Map,ForEach和Slice

對於普通的一維陣列,函數Map,ForEach,Slice都提供深拷貝的功能,但是對於巢狀陣列,這些函數對於內部陣列的處理不提供深拷貝的功能。

06總結

Object.assign和Object.create都可以進行物件的複製。

使用assign方法時,我們必須確保物件至少複製第二個參數。通常你只會傳遞一個空物件作為第一個參數。它不提供類似於擴展運算符的完整拷貝。

使用create方法時,現有物件作為新創建物件的原型創建一個新物件。現有物件作為原型可用,從而使所有屬性都可用於新物件。但就複製而言,它提供了部分深複製,如分配和擴展運算符。

在 JavaScript 中複製物件的唯一陷阱是巢狀值。


IT145.com E-mail:sddin#qq.com