賦值 淺拷貝和深拷貝

2022-06-05 11:03:06 字數 1797 閱讀 3690

三種方法的形式存在一定的類似,但是也存在各個之間不相同的地方。

淺拷貝和深拷貝是用在物件(object)或者陣列(array)這樣的資料型別拷貝賦值時候的說法,而賦值操作也可以用在基礎的資料型別,如number、string等;

賦值(對於物件型別資料的影響):賦於該值在棧中的位址,而不是堆中的資料,使得兩個物件同時指向到同乙個儲存的空間,如果有某乙個物件改變,其實都是改變儲存空間的內容,從而對兩個物件都產生相同的影響;

var aa = [ 1, 2, 3 ],bb;

bb = aa;

console.log(aa, bb); // aa = [1,2,3], bb = [1,2,3];

bb.push(5);//這裡操作的是aa、bb指向的儲存空間,所以aa、bb的值都發生了變化

console.log(aa, bb); // aa = [1,2,3,5], bb = [1,2,3,5];

bb[0] = 10;//這裡操作的是aa、bb指向的儲存空間,所以aa也發生了變化

console.log(aa, bb); // aa = [10,2,3,5], bb = [10,2,3,5];

bb = [ 2, 3, 4 ];//這裡已經把bb指向了另乙個陣列,所以不會影響aa的值

console.log(aa, bb); // aa = [1,2,3,5], bb = [2,3,4];

淺拷貝(按位拷貝物件,如果是基本資料型別,就拷貝這個型別的值,如果是記憶體物件,則拷貝這個記憶體位址,所以淺拷貝介於賦值與深拷貝之間,淺拷貝過來的物件,可能存在改變某乙個屬性的值會影響另乙個物件,也可能不影響)

ps:該淺拷貝的方法會覆蓋原物件中相同屬性的值,不需覆蓋可以進行判斷

//淺拷貝的方法

深拷貝,相對於淺拷貝,就是把對於引用內容位址的物件,新開闢一塊新的記憶體位址用於存放拷貝過來的內容,從而使得兩個物件不會再相互影響

ps:深拷貝涉及到比較複雜的資料型別的判斷,

可遍歷的:object、array 、map、set

不可遍歷的:bool、number、string、date、error等

還有正則、轉殖函式等

//簡單對物件型別進行判斷

var extend = function(to, from) ; //進行判斷,屬性的值是物件還是陣列

for (var key in from[property])

to[property] = clonetarget;

} else

} return to;

};

...未完待續(後面可能補充有關對於型別的判斷,還有一些其它大神看到的效能優化、迴圈引用的問題)

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

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

賦值 淺拷貝 深拷貝

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

深拷貝 淺拷貝 賦值

賦值 class teacher class student student s1 new student student s2 s1 s1 s2,指向的記憶體區域相同 拷貝 class teacher class student implement cloneable student s1 new...