深拷貝VS淺拷貝 巷子

2022-07-04 06:36:10 字數 2144 閱讀 3627

1、回顧

資料傳遞的方法:

值傳遞:基本資料型別的資料不會發改變,因為基本資料型別一般存放在棧裡面,值傳遞只是將資料拷貝了乙份給另乙個變數

例如: 值傳遞

var a = 10;

var b =a;

b+=10;

console.log(a);

//10

console.log(b);//

20;引用傳遞

var arr = [10,20,30,40];

var newarr =arr;

newarr[0] = 80;

console.log(arr);

//[80,20,30,40]

console.log(newarr);//

[80,20,30,40];

因為引用資料型別傳遞是儲存了記憶體中的位址,當乙個資料發生改變的時候 位址裡面的資料也會傳送改變

2、淺拷貝

淺拷貝:所謂的淺拷貝就是複製乙份引用資料型別的位址,當改變了記憶體中資料的某乙個值得話,也會影響到另乙個物件

淺拷貝的方式:

淺拷貝1

var obj =

var newobj =obj;

newobj.name="李四";

console.log(obj);

// console.log(newobj);//

淺拷貝2

object.assgin()

引數1:目標物件

引數2:任意多個物件

如果物件是多層的話

var obj = };

var obj1 =object.assign({},obj);

obj1.data.a = 10;

console.log(obj);//}

淺拷貝3

封裝copyattr()

如果物件是多層的話

function

copyattr(obj);

for(var key in

obj)

return

newobj;

}var obj = };

var newobj =copyattr(obj);

newobj.data.a = 10;

console.log(obj)//}

淺拷貝4

$.extend({},obj)

var obj = };

var newobj =$.extend({},obj);

newobj.data.a = 10;

console.log(obj);

// console.log(newobj);//

3、深拷貝

深拷貝:所謂的深拷貝就是複製乙份引用資料型別的資料,當改變了資料的某乙個值得話,不會影響到另乙個物件(注意深拷貝是拷貝的資料,而不是索引,淺拷貝拷貝的是索引而不是資料)

深拷貝1

object.assign();

如果物件只有一層的

var obj = ;

var newobj =object.assign({},obj);

newobj.a = 10;

console.log(obj);

// console.log(newobj);//

深拷貝2

$.extend(

true

,{},obj)

var obj = ;

var newobj = $.extend(true

,{},obj);

newobj.a = 10;

console.log(obj);

// console.log(newobj);//

深拷貝3

json.stringify()

var obj = };

var newobj =json.parse(json.stringify(obj));

newobj.data.a = 10;

console.log(obj);

// console.log(newobj);//

缺點:沒有辦法將函式轉換為json

深拷貝 vs 淺拷貝

深拷貝和淺拷貝都是針對的引用型別,js中的變數型別分為值型別 基本型別 和引用型別 對值型別進行複製操作會對值進行乙份拷貝,而對引用型別賦值,則會進行位址的拷貝,最終兩個變數指向同乙份資料。基本型別 var a 1 var b a a 2 console.log a,b 2,1 a b指向不同的資料...

C 之深拷貝VS淺拷貝

1.淺拷貝 將值直接拷貝過去 只是對指標的拷貝,拷貝之後兩個指標指向同一塊記憶體,會造成系統奔潰 class array include include array.h using namespace std array array int count array array const array...

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...