深度解析深拷貝和淺拷貝
作為一名前端開發工程師,在平時的工作開發中,專案中有時候肯定會遇到儲存、解析後端傳遞過來的相關資料的,那麼不可避免的肯定會用到深拷貝、以及淺拷貝的相關知識,哪怕是在面試過程中都會遇到這麼一道看似簡單的面試題,面試官讓你深度剖析其實現方式及應用場景,手寫你實現原始碼,接下來讓我們一起了解一下實現方式吧,不足之處還請各位大佬指點一二
**我們先從深拷貝開始,何為深拷貝?**就是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也是可以實現深拷貝的,一下為相關程式碼,可以幫助我們更好的理解深複製
相關注釋僅代表個人觀點,意在更好的理解,實現原理依靠的是遞迴、深度遍歷賦值
接下來讓我們看一下淺拷貝
1、我們都知道js中基礎的資料賦值手段 = 號,我們就可以理解為淺拷貝,將其中一個變數直接指向另一個變數,改變其儲存指標
2、Object.assign方法是ES6中擴充的新函式,也是淺拷貝的典型手段,Object.assign()方法可以把任意多個的源物件自身的可列舉屬性拷貝給目標物件,返回合併後的目前物件,該方法拷貝的是源物件自身屬性的引用,而不是物件本身。
3、ES6中…獲取剩餘引數的結構語法,逆運用的方式,實現的也算是淺拷貝的一種,感興趣的同學可以試試
總的來說,淺拷貝是拷貝一層,深層次的物件級別的引用型別就拷貝引用;深拷貝則是拷貝多層,每一層級的資料都會拷貝出來,且不會因為原有資料的改變發生改變;淺拷貝也好深拷貝也好,不過都是js中一些常見的運算元據的手段而已,工作中多使用幾次基本就理解其原理了
相關文章
- 淺拷貝和深拷貝
- 深拷貝和淺拷貝
- iOS深拷貝和淺拷貝iOS
- js 深拷貝和淺拷貝JS
- JavaScript淺拷貝和深拷貝JavaScript
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- JavaScript深拷貝和淺拷貝JavaScript
- js 淺拷貝和深拷貝JS
- 淺拷貝&深拷貝
- python 指標拷貝,淺拷貝和深拷貝Python指標
- 淺探js深拷貝和淺拷貝JS
- JavaScript 深度拷貝和淺拷貝JavaScript
- go slice深拷貝和淺拷貝Go
- js之淺拷貝和深拷貝JS
- ECMAScript-淺拷貝和深拷貝
- C++淺拷貝和深拷貝C++
- JavaScript之深拷貝和淺拷貝JavaScript
- js的深拷貝和淺拷貝JS
- 聊聊物件深拷貝和淺拷貝物件
- java深克隆(深拷貝)和淺克隆(淺拷貝)Java
- 淺拷貝與深拷貝
- 淺談深拷貝與淺拷貝?深拷貝幾種方法。
- js實現深拷貝和淺拷貝JS
- VUE 中 的深拷貝和淺拷貝Vue
- 對淺拷貝和深拷貝的理解
- JS深拷貝與淺拷貝JS
- python深拷貝與淺拷貝Python
- Python淺拷貝與深拷貝Python
- javascript 淺拷貝VS深拷貝JavaScript
- 淺談Java中的淺拷貝和深拷貝Java
- 深入淺出深拷貝與淺拷貝
- Javascript知識點:淺拷貝和深拷貝JavaScript
- javaScript深拷貝和淺拷貝簡單梳理JavaScript
- 【Python】直接賦值,深拷貝和淺拷貝Python賦值
- Python擴充套件_淺拷貝和深拷貝Python套件
- js 陣列的淺拷貝和深拷貝JS陣列
- [JS系列二]談談深拷貝和淺拷貝,如何實現深拷貝JS