1. 程式人生 > 其它 >javaScript淺拷貝和深拷貝

javaScript淺拷貝和深拷貝

javaScript淺拷貝和深拷貝

一、淺拷貝和深拷貝的理解

淺拷貝和深拷貝是針對引用資料型別而言的。對於基本資料型別是沒有深淺拷貝的概念。

從儲存的角度理解:

js的基本資料型別(String,Number,Boolean,null,Undefined)是存在棧記憶體的,當發生賦值b=a時會直接在棧記憶體中開闢一個新空間。a和b是兩塊獨立的空間。修改b不會影響a的值。

而js對於引用資料型別object。儲存時會在棧記憶體儲存引用(堆記憶體中存值的地址),堆記憶體儲存真正的值,棧記憶體中的引用指向堆記憶體的值。

當發生=的賦值操作b=a時,實際上只是把a的引用複製給了b,也就是說a和b指向的堆記憶體中同一片地址空間。像這種只拷貝引用的就是淺拷貝

深拷貝就是在堆記憶體中開闢一塊新的空間,把原來物件拷貝物件的值複製到新的儲存空間,引用指向新的儲存空間。這樣a和b就是兩個完全不同

的物件。修改b的時候不會同步修改a的值。

二、深拷貝的實現

2.1深拷貝的簡單實現

對於可以直接轉成json的object型別。可以通過先將object轉成json字串(JSON.stringify)然後解析(JSON.parse)實現深拷貝。這個是我比較常用的方法

下面是一段小程式一段通過這種方式實現深拷貝的程式碼

    var app = getApp();
    let listStr=JSON.stringify(app.globalData.carNumList);//
全域性變數直接賦值給subCarNumList是淺拷貝,修改會同步修改全域性變數 let subCarNumList =JSON.parse(listStr); console.log(subCarNumList); subCarNumList.push('新增車牌號'); console.log("全域性:",app.globalData.carNumList); this.setData({ subCarNumList:subCarNumList });

2.2遞迴實現深拷貝

function test4(){
    var
arr=['a','b','c']; var arrNew=deepCopy(arr); arrNew.push("d"); console.log("arr",arr); console.log("arrNew",arrNew); } function deepCopy(obj){ var copyObj=Array.isArray(obj)?[]:{}; for(var key in obj){ if(obj[key]&&typeof obj[key]==='object'){ copyObj=deepCopy(obj[key]); } else{ copyObj[key]=obj[key]; } } return copyObj; }

列印結果:

2.3直接複製淺拷貝展示

程式碼:

function test4(){
    var arr=['a','b','c'];
    //var arrNew=deepCopy(arr);
    var arrNew=arr;
    arrNew.push("d");
    console.log("arr",arr);
    console.log("arrNew",arrNew);
}

列印結果: