js深拷貝與淺拷貝

2021-08-07 17:07:05 字數 1444 閱讀 7073

1 基礎知識:基本型別與引用型別

js中可以把變數分成兩部分,基本型別和引用型別。

基本型別包括:undefined、null、boolean、number和string;

引用型別值可能由多個值構成的物件。

在對基礎型別資料進行拷貝時,實際相當於建立新的相同資料'hello',賦值給b

var a='hello';

var b =a;

b = 'world';

console.log(a);

//"hello"

在對引用型別資料進行拷貝時,操作的不是實際的物件而是物件的引用,通過指標指向相同的記憶體區域,所以值相等;

在下面的**中,因為arr和arr1指向同一記憶體區域,所以當改變arr1的值時,arr也跟著改變了

var arr = ['1','2'];

var arr1 =arr;

arr1[0] = '11';

console.log(arr);

//["11", "2"]

2 淺拷貝

當我們在對引用型別資料進行拷貝時,就會產生類似上面子物件資料改變引起父物件資料同時改變的情況,這種拷貝就叫淺拷貝。

function

shallowcopy(src) ;

for (var prop in

src)

return

dst;

}var xiaoming = ;

var xiaoli =shallowcopy(xiaoming);

//如果將拷貝後的物件xiaoli的愛好更改,原物件xiaoming就也被更改了

//因為xiaoli的hobby屬性是個陣列,即引用型別的資料,所以複製到的內容只是乙個記憶體位址,並不是建立的新內容,詳情請參考js的基本型別和引用型別

xiaoli.hobby[0] = '畫畫';

console.log(xiaoming);

// 小明的內容也別改變了

3深拷貝

實現深拷貝的方法就是將淺拷貝遞迴,讓每一次賦值都通過基礎型別的建立新資料的賦值方式進行賦值

function

deepcopy(src,dst);

for (var i in

src) ;

deepcopy(src[i],dst[i]);

}else

} return

dst;

}var xiaoming2 = ;

var xiaoli2 =deepcopy(xiaoming2);

xiaoli2.hobby[0] = '畫畫';

console.log(xiaoming2);

// xiaoming的內容不變

js 淺拷貝與深拷貝

js 有兩種資料型別,基礎資料型別和引用資料型別 基礎資料型別都是按值訪問的,我們可以直接操作儲存在變數中的實際的值。而引用型別如array,1.淺拷貝 只複製指向某個物件的指標,而不複製物件本身,新舊物件共享一塊記憶體 淺拷貝是指只複製一層物件,當物件的屬性是引用型別時,實質複製的是其引用,當引用...

js深拷貝與淺拷貝

實現乙個頁面或者乙個功能時,常常遇到的場景需要我們備份乙個陣列或者物件,這時候出現了深拷貝與淺拷貝效果截然不同呀總結如下 var arr 1,2,3,4 shallowarr arr arr 0 change console.log arr console.log shallowarr change...

JS 深拷貝與淺拷貝

參考學習 在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體。深拷貝 陣列 法一 for迴圈 let arr1 1,2,3 let arr2 copyarr arr1 function copyarr a...