當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件的在棧中的位址,而不是堆中的資料。也就是兩個物件指向的是同乙個儲存空間,無論哪個物件發生改變,其實都是改變的儲存空間的內容,因此,兩個物件是聯動的。
//賦值
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 基本資料型別,儲存在 棧 中,記憶體可以及時 引用型別值是可變的,比較是引用的比較,看其引用是否指向同乙個物件 引用...