幾個例子理解淺拷貝和深拷貝

2022-08-23 16:00:18 字數 1861 閱讀 3648

一、記憶體的堆疊

基本型別

存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配,當它賦給另乙個變數的時候,另乙個變數發生改變,原資料不會發生改變:

var a = 5;

var b = a;

b += 1;

console.log(b) //6

console.log(a) //5

5種基本資料型別有undefined、null、boolean、number 和 string,它們是直接按值存放的,所以可以直接訪問。

引用型別

存放在堆記憶體中的物件,變數實際儲存的是乙個指標,這個指標指向另乙個位置。每個空間大小不一樣,要根據情況進行特定的分配。當我們需要訪問引用型別(如物件,陣列,函式等)的值時,首先從棧中獲得該物件的位址指標,然後再從堆記憶體中取得所需的資料。

上面的例子把a的值賦值給b,當b的值發生改變的時候,a的值也會跟隨改變,像上面的**一樣,a和b都是指向同乙個位址。如果要讓b得到乙個獨立的位址呢?這就涉及到拷貝了。

二、object.assign

淺拷貝是複製淺層的引用型別,比如複製a = 這樣的物件就是屬於淺拷貝,它只有一層,像複製b = }這樣有巢狀的物件,多層的引用型別,就需要用到深拷貝了。

var a = ;

var b = object.assign({} , a);

b.username = 'xiaoming';

console.log(a); //

console.log(b); //

這樣,我們就能得到乙份淺拷貝內容了,即使是b發生改變,也不會影響到a,它們完全是兩個獨立的個體,但是此方法不適用深拷貝。

三、展開運算子

var a = ;

var b = ;

b.username = 'xiaoming';

console.log(a); //

console.log(b); //

這樣,我們也能得到乙份淺拷貝內容。

四、json.parse()&json.stringify()

var a = };

var b = json.parse(json.stringify(a));

b.info.username = 'xiaoming';

console.log(a); // };

console.log(b); // };

五、for...in&遞迴(推薦)
var a = };

var b = copy(a);

b.info.username = 'xiaoming'

function copy(obj);

for(var attr in obj)

else

}return result;

} console.log(a); // };

console.log(b); //

這樣,就可以得到乙份深拷貝內容了,其原理就是層層拷貝,利用遞迴的原理,直到最底層不是物件為止,好啦,本次分享就到這裡了,如果有什麼不正確的地方,請各位不吝賜教,謝謝~

理解「淺拷貝」和「深拷貝」

淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...

c 淺拷貝和深拷貝理解

為什麼c 會設定這兩種拷貝呢,因為在某些情況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是說把物件裡的值完全複製給另乙個物件,如a b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那麼a中的那個成員變數也指向同一塊記憶體。這就出現了問題 當b把記憶體釋放了 析構 這時a記憶體就成...

深拷貝和淺拷貝的理解

為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...