深度解析深拷貝和淺拷貝

一條臭鹹魚吖發表於2021-01-02

作為一名前端開發工程師,在平時的工作開發中,專案中有時候肯定會遇到儲存、解析後端傳遞過來的相關資料的,那麼不可避免的肯定會用到深拷貝、以及淺拷貝的相關知識,哪怕是在面試過程中都會遇到這麼一道看似簡單的面試題,面試官讓你深度剖析其實現方式及應用場景,手寫你實現原始碼,接下來讓我們一起了解一下實現方式吧,不足之處還請各位大佬指點一二

img

**我們先從深拷貝開始,何為深拷貝?**就是js中各種型別值的複製(Number、String、Boolean、undefined、object、Null、Symobl),引用型別也是直接複製(function、Array、Date),執行深複製後,原有資料或複製後的資料其中一個改變,另一個不會改變,我們也可以理解為深度(deep)複製,先了解其實現的以下幾種方式

1、jquery作為前些年主流的操作dom的框架,就為我們提供過相關的實現方式;該框架中的extend方法的第一個引數傳遞為true,返回的執行結果就是深拷貝

http://bbs.damoxueyuan.com/?thread-845.htm

模擬了一下 jQuery 中的 extend 方法,大家可以參考一下

2、深拷貝的另一種方法,我們可以使用js中JSON系列化及反序列化的方法,(JSON.stringify把物件轉成字串,再用JSON.parse把字串轉成新的物件)。該方法也是有一些弊端的,這裡解釋一下,如果是複製的是(Function、regExp)會造成資料丟失,因為該方法並不支援這兩種引用型別的賦值操作

3、原生js也是可以實現深拷貝的,一下為相關程式碼,可以幫助我們更好的理解深複製

img

相關注釋僅代表個人觀點,意在更好的理解,實現原理依靠的是遞迴、深度遍歷賦值

接下來讓我們看一下淺拷貝

1、我們都知道js中基礎的資料賦值手段 = 號,我們就可以理解為淺拷貝,將其中一個變數直接指向另一個變數,改變其儲存指標

2、Object.assign方法是ES6中擴充的新函式,也是淺拷貝的典型手段,Object.assign()方法可以把任意多個的源物件自身的可列舉屬性拷貝給目標物件,返回合併後的目前物件,該方法拷貝的是源物件自身屬性的引用,而不是物件本身。

3、ES6中…獲取剩餘引數的結構語法,逆運用的方式,實現的也算是淺拷貝的一種,感興趣的同學可以試試

總的來說,淺拷貝是拷貝一層,深層次的物件級別的引用型別就拷貝引用;深拷貝則是拷貝多層,每一層級的資料都會拷貝出來,且不會因為原有資料的改變發生改變;淺拷貝也好深拷貝也好,不過都是js中一些常見的運算元據的手段而已,工作中多使用幾次基本就理解其原理了

相關文章