賦值 淺拷貝 深拷貝 的區別總結

2021-09-12 12:54:22 字數 1631 閱讀 4108

當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件的在棧中的位址,而不是堆中的資料。也就是兩個物件指向的是同乙個儲存空間,無論哪個物件發生改變,其實都是改變的儲存空間的內容,因此,兩個物件是聯動的。

//賦值

var obj1 = ;

var obj2 = obj1;

= "lisi";

= ["二","三"];

obj2.name = "lisi";

obj2.language[1] = ["二","三"];

console.log('obj1',obj1.name+" ",obj1.age+" ",obj1.language.tostring())

console.log('obj2',obj2.name+" ",obj2.age+" ",obj2.language.tostring())

執行結果:淺拷貝只複製指向某個物件的指標,而不複製物件本身,新舊物件還是共享同一塊記憶體。

淺拷貝是按位拷貝物件,這個物件有著原始物件屬性值的乙份精確拷貝。如果屬性是基本型別,拷貝的就是基本型別的值;如果屬性是記憶體位址(引用型別),拷貝的就是記憶體位址 ,因此如果其中乙個物件改變了這個位址,就會影響到另乙個物件。即預設拷貝建構函式只是對物件進行淺拷貝複製(逐個成員依次拷貝),即只複製物件空間而不複製資源。

//淺拷貝	

var obj3 = ;

var obj4 = shallowcopy(obj3);

obj4.name = "lisi";

obj4.language[1] = ["二","三"];

function shallowcopy(src) ;

for (var prop in src)

}return dst;

}console.log('obj3',obj3.name+" ", obj3.age+" ",obj3.language.tostring())

console.log('obj4',obj4.name+" ", obj4.age+" ",obj4.language.tostring())

可見,基本型別的屬性值沒變,引用型別的屬性值變了;

//深拷貝

let arr = [1, 3, ];

let arr4 = json.parse(json.stringify(arr));

arr4[0] = 'duncan';

arr4[1]= 'duncan';

arr4[2].username = 'duncan';

console.log(arr, arr4)

執行結果:

可見,改變複製品的屬性值不會改變元資料的值;

總結:

賦值,淺拷貝,深拷貝的區別

一 賦值 copy 賦值是將某一數值或物件賦給某個變數的過程,分為下面 2 部分 基本資料型別 賦值,賦值之後兩個變數互不影響 引用資料型別 賦址,兩個變數具有相同的引用,指向同乙個物件,相互之間有影響 let a 10 let b a console.log a 10 console.log b ...

淺拷貝 深拷貝和淺賦值 深賦值

include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...

賦值 淺拷貝 深拷貝

堆是動態分配記憶體,記憶體大小不一 棧是自動分配相對固定大小的記憶體空間,並由系統自動釋放 基本資料型別值是不可變的,比較是值的比較 基本資料型別,傳值。開闢乙個新的記憶體空間 js 基本資料型別,儲存在 棧 中,記憶體可以及時 引用型別值是可變的,比較是引用的比較,看其引用是否指向同乙個物件 引用...