在js中有5種基本的資料型別:number、boolean、undefined、null、string,還有一種複雜的資料型別––object,基礎資料型別不存在深拷貝和淺拷貝的問題,只有object物件才會有這個煩惱。
var a = ;
var b = a; // 淺拷貝操作
a.age = 26;
console.info(a.age); // 26
console.info(b.age); // 26 b也跟著變了
var a = ;
var b = json.parse(json.stringify(a)); // 深拷貝操作
a.age = 26;
console.info(a.age); // 26
console.info(b.age); // 18 b沒跟著變
淺拷貝:舉個栗子:
var array = new array();
在這個時候首先執行new array(),此時瀏覽器會在記憶體中開闢乙個此陣列例項的記憶體空間,接著執行var array,此時會建立乙個array引用,指向new array()這個例項,進行關聯。後面我們就可以通過 array這個引用來訪問這個陣列,注意:後面都是通過array這個引用來運算元組,如果此時你把array賦值給另乙個變數,那麼此時這個陣列例項就有多個引用同時指向它,而此時把array賦值給另乙個變數的操作就是淺拷貝。
例如:
var array1 = new array();
var array2 = array1; // 淺拷貝操作,此時array1、array2都是指向new array()例項,下同
array1.push(1);
array1.push(2);
array1.push(3);
console.info(array1); // 輸出 [1, 2, 3]
console.info(array2); // 輸出 [1, 2, 3]
array2 = ;
console.info(array1); // 輸出
console.info(array2); // 輸出
上面的操作中,例項永遠只有乙份,但同時有2個引用指向它,這個時候2個引用其實操作的永遠都是同乙個陣列。
深拷貝:
深拷貝是把原本的物件例項拷貝乙份出來變成乙個新的例項物件。
舉個栗子
var array1 = ;
var array2 = json.parse(json.stringify(array1)); // 深拷貝操作
先說說原理:上面說到js的基礎資料型別是不存在深拷貝淺拷貝的,因為基礎資料型別的值是不可變的,引用和值都是存在棧記憶體區,這個深拷貝的方法就是利用這一點來實現,首先把a物件轉換成基礎型別的字串,然後通過json物件方法,把字串轉換成json物件,來例項化乙個和a值一樣但記憶體位址不同的物件(注意:這個深拷貝的方法不能拷貝物件中的方法屬性)
當然還有很多其他實現深拷貝的方法,但在使用的過程中注意每種深拷貝方法的限制,最適合自己的才是最好的。
打個比方來說說深、淺拷貝的不同:
比如說現在春運的搶票軟體,開始你使用攜程來搶票,後面你又用360來搶票,但最終都是從12306出票,這種情況你不管換什麼搶票軟體,最終都要去12306那邊下單,這個時候就是淺拷貝,搶票軟體就是引用,12306就是物件的記憶體位址,不管你怎麼換搶票軟體,12306永遠只有乙份,你用不同的搶票軟體,只是增加了指向12306的引用個數而已,這就是淺拷貝;想要深拷貝,就必須增加12306的個數。比如為了分流,單獨成立了乙個45789的售票系統,並且兩邊**的票是一模一樣,這個時候你用智行來搶票且智行只從45789下單,這個時候就是深拷貝了,因為智行指向的是45789,攜程、360都是指向12306,雖然3個引用的初始值是一樣的,但是指向的不是同乙個物件,你在智行上搶到了票對攜程和360沒什麼影響,這就是深拷貝。、
是不是新的,是則是深拷貝,不是則是淺拷貝。
js 淺拷貝直接賦值 js的賦值與淺拷貝 深拷貝
昨天翻了下陣列api,看到concat和slice方法,突然想到這個兩個方法是淺拷貝還是深拷貝,結果陷入了死胡同,為什麼mdn文件說是淺拷貝,但進行簡單的操作為什麼能複製成功啊,糾結半天後才弄清原由,原來我一直把賦值和深淺拷貝搞混了。首先不要把引用型別的賦值歸結為淺拷貝,深拷貝和淺拷貝只針對像 ob...
js 物件深拷貝 深拷貝與淺拷貝
前言 最近在複習一些面試的知識點,剛剛好複習到了這一部分,於是就寫下這篇文章記錄一下。一 值型別和引用型別 在學習深拷貝和淺拷貝之前,我們先來了解一下js的變數型別。值型別 vs 引用型別 值型別 值型別主要有 number,string,boolean,symbol,null,undefined ...
c 深入解析淺拷貝與深拷貝
淺拷貝,也稱位拷貝,編譯器只是將物件中的值拷貝過來,如果物件中管理資源,最後就會導致多個物件共享同乙份資源,當乙個物件銷毀時就會將該資源釋放掉,而此時另一些物件不知道該資源已經被釋放,以為還有效,所以當繼續對資源進行操作時就會出現訪問違規 先看一段 class string string strin...