引用類型的深拷貝與淺拷貝

什麼是深拷貝與淺拷貝

我們都知道在Js當中數據類型是分爲基本數據類型和引用數據類型,基本數據類型有Number、String 、Boolean、Null、Undefined這裏就不一一細說了,我們今天主要來說說引用類型的深拷貝與淺拷貝問題,引用類型Object,主要又分爲對象{},和數組[]。
在這裏我們又要引入一個知識點,就是棧內存跟堆內存,基本數據類型都是存儲在棧內存中的,而引用類型都是存儲在堆內存中的,看圖
在這裏插入圖片描述
在這裏插入圖片描述
如圖所示,棧內存拷貝之後是重新開闢了一個存儲空間,而堆內存拷貝則是相當於給予了一個通爲堆內存的鏈接地址,兩則之間的內容還是有聯繫的,如果改變一個值,另一個值也會改變,這樣會帶來許多不便,這時候我們就需要用深拷貝和淺拷貝這個兩個詞來解決這個問題。
1、淺拷貝
什麼是深拷貝與淺拷貝,簡單來講淺拷貝是隻能實現一維數組的拷貝,比如arr=[1,2,3,4,5,6],但是對二維或者多維數組就不行,比如arr=[1,[2,3,4],5,6,7],淺拷貝就不能讓數組裏的數組[2,3,4]改變兩者不影響,而深拷貝就能實現。

var arr1 = [1,2,3,4,5,6,7];
    var arr2 = [];
    for (var j = 0;j<arr1.length;j++){
        arr2.push(arr1[j])
    }
    console.log(arr2);//[1, 2, 3, 4, 5, 6, 7]

關於淺拷貝如以上代碼所示一個簡單的for循環就能夠實現。

2、深拷貝
實現深拷貝可以套用for循環然後不斷遞歸來實現

function fm(arrx) {
        var arry =[];
        for (var k = 0;k<arrx.length;k++){
            if (typeof arrx[k]==="object"){
                arry[k]=new Array();
                arry[k] = fm(arrx[k])
            }else {
                arry[k] = arrx[k];
            }

        }
        return arry
    }
    var arrx = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
    var arr1122 = fm(arrx);

    arrx[4][2][0]="ddd";
    console.log(arrx);//1,2,3,4,5,6,7,8,ddd,8,9
    console.log(arr1122);//1,2,3,4,5,6,7,8,8,8,9

還有的就是用Json來實現

 arr1 = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
    var arrN = JSON.parse(JSON.stringify(arr1));

這樣arrN就重新生成了新的數組了。
還有一種就是用數組的slice的方法

var arr2 =[2,3,1,53,2,5];
    var arr3 = arr2.slice(0);

通過切片的方式,arr3生成了一個新數組,數組就是arr2裏的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章