深拷貝: 之前在開發中我遇到一個很大的bug,經過我多次調試之後我發現原本應該有保存數據的地方數據全部被清空,仔細一看發現原來是被人為刪除,明明操作的是一個副本,為什麼原本也會跟著一起被刪除呢?經過瞭解我發現深拷貝這個說法。深拷貝和淺拷貝在js以及python中都是存在的,指定一個數組然後 ...
深拷貝:
之前在開發中我遇到一個很大的bug,經過我多次調試之後我發現原本應該有保存數據的地方數據全部被清空,仔細一看發現原來是被人為刪除,明明操作的是一個副本,為什麼原本也會跟著一起被刪除呢?經過瞭解我發現深拷貝這個說法。深拷貝和淺拷貝在js以及python中都是存在的,指定一個數組然後直接讓一個變數等於該數組,接著改變該變數的話,指定的數組也會跟著發聲改變。如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。
我們來舉個淺拷貝例子:
let a=[0,1,2,3,4], b=a; console.log(a===b); a[0]=1; console.log(a,b);
我發現深拷貝僅對於引用的數據類型諸如數組和對象起作用,但是對於基本數據類型諸如字元串以及數字等沒有深淺拷貝這一說法。
引用數據類型--名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供一個引用的地址指向堆記憶體中的值,我們以上面淺拷貝的例子,當b=a進行拷貝時,其實複製的是a的引用地址,而並非堆裡面的值。
我們該怎樣去實現深拷貝呢:
1.可以遞歸的迴圈的去複製相關屬性;
2.slice方法,可以使用slice()方法,這樣拷貝在一維的數組可以實現深拷貝,但是對於二維數組而言無法實現深拷貝;
3.第三個方法就是使用JSON.stringify()以及JSON.parse()方法,先進性stringify在進行parse,這樣得到的也是屬於一個深拷貝;
4.使用jq提供的extend方法: let a=[0,1,[2,3],4], b=$.extend(true,[],a); true表示開啟深度拷貝,false為淺拷貝;
以上屬於js語言的內容,還有python的深拷貝:
python相對比較簡單,直接使用copy庫,包括copy()以及deepcopy()這2個,c=copy.copy(alist),這樣是淺拷貝,只能對一級對象實現深拷貝,二級對象沒有實現深拷貝,copy.deepcopy(alist)可以實現完全深度拷貝;