標籤:基礎類型 另一個 複製 clone 大致 淺複製 alt 兩種 htm
要弄懂這些概念,著實不易,尤其是深淺拷貝。這裡舉個不恰當例子便於理解,淺拷貝是雙胞胎,深拷貝是單獨複製自己。
一、資料類型分類:
二、什麼叫做指標指向
棧記憶體、堆記憶體、指標指向(如下紅圈圈的斜線)。
三、賦值、拷貝、引用區別?
- 賦值指
一個變數賦予某個值,包含兩種方式,一種是直接量,另一種,是將另一個變數的值傳遞給這個變數。拷貝和引用都屬於後者。
- 引用的目的是
將指標指向相同堆記憶體中的某一位置。
- 拷貝的目的是
改變指標的指向,並且內部屬性或者元素的值相等。基礎資料類型在賦值過程就改變了指標指向,所以通常說,基礎類型的引用只存在唯讀狀態。複雜資料類型的指標指向包含兩種一種是指標指向棧記憶體,另一種是指標指向堆記憶體,前者只需賦值即可,可後者沒那麼容易。
var person = { name: ‘lc‘, friends: [‘xm‘,‘xm‘,‘xl‘]}
從這段代碼,我們很清楚知道person.name、person.friends中的每個元素的指標指向棧記憶體,person和person.friends的指標指向堆記憶體,由此我們可以得出兩點:
- 拷貝改變複雜資料類型的指標指向,必須是先改變指向堆記憶體的指標指向,如
person的指標指向。
- 拷貝改變指標指向,可以只改
person的指標向,這類叫做淺拷貝(淺複製);也可以改變person、person.friends等全部指標指向,這類通常叫做深拷貝(深複製)。
四、淺拷貝和深拷貝
在上面,我已描敘了淺拷貝和深拷貝,在這裡再嚴謹的總結一下:淺拷貝只改變複雜資料類型內部分的指標指向,也就是不完全改變;深拷貝徹頭徹底地改變所有指標指向,也就是完全改變。
淺拷貝
以上例代碼為例:
var shallow_copy={};for(var i in person) { shollow_copy[i] = person[i];}
或者 es6 的 Object.assign()
深拷貝
實現的方法也是多種,大致上可以分為兩類: 一類是json,另一類是遞迴迴圈遍曆賦值。
其中最常見的是JQuery中$.extend()。
其他
理解這些,像es6文法中const,es6模組和commonJS模組的區別等問題就變得非常好理解。
本文是參考眾多文章,並自己總結得出的,若有什麼不對,請見諒和指出。
像如何驗證淺拷貝至改變部分指標指向、深拷貝具體實現方法有哪些等問題,也可以參考下面文檔:
文檔1
文檔2
文檔3
[源碼示範,待續。。。]
Javascript 對象複製(深淺拷貝)