回覆列表
-
1 # pzyyo24296
-
2 # 使用者2069460986578
簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺複製,拿人手短,如果A沒變,那就是深複製,自食其力。
此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深複製與淺複製。
我們來舉個淺複製例子:
let a=[0,1,2,3,4],
b=a;
console.log(a===b);
a[0]=1;
console.log(a,b);
嗯?明明b複製了a,為啥修改陣列a,陣列b也跟著變了,這裡我不禁陷入了沉思。
那麼這裡,就得引入基本資料型別與引用資料型別的概念了。
面試常問,基本資料型別有哪些,number,string,boolean,null,undefined五類。
引用資料型別(Object類)有Object,Array,Date等。
而這兩類資料儲存分別是這樣的:
a.基本型別--名值儲存在棧記憶體中,例如let a=1;
當你b=a複製時,棧記憶體會新開闢一個記憶體,例如這樣:
所以當你此時修改a=2,對b並不會造成影響,因為此時的b已自食其力,翅膀硬了,不受a的影響了。當然,let a=1,b=a;雖然b不受a影響,但這也算不上深複製,因為深複製本身只針對較為複雜的object型別資料。
b.引用資料型別--名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供一個引用的地址指向堆記憶體中的值,我們以上面淺複製的例子畫個圖:
當b=a進行複製時,其實複製的是a的引用地址,而並非堆裡面的值。
而當我們a[0]=1時進行陣列修改時,由於a與b指向的是同一個地址,所以自然b也受了影響,這就是所謂的淺複製了。
那,要是在堆記憶體中也開闢一個新的記憶體專門為b存放值,就像基本型別那樣,起步就達到深複製的效果了
簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺複製,拿人手短,如果A沒變,那就是深複製,自食其力。此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深複製與淺複製。我們來舉個淺複製例子:嗯?明明b複製了a,為啥修改陣列a,陣列b也跟著變了,這裡我不禁陷入了沉思。那麼這裡,就得引入基本資料型別與引用資料型別的概念了。面試常問,基本資料型別有哪些,number,string,boolean,null,undefined五類。引用資料型別(Object類)有Object,Array,Date等。而這兩類資料儲存分別是這樣的:a.基本型別--名值儲存在棧記憶體中,例如let a=1;當你b=a複製時,棧記憶體會新開闢一個記憶體,例如這樣:所以當你此時修改a=2,對b並不會造成影響,因為此時的b已自食其力,翅膀硬了,不受a的影響了。當然,let a=1,b=a;雖然b不受a影響,但這也算不上深複製,因為深複製本身只針對較為複雜的object型別資料。b.引用資料型別--名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供一個引用的地址指向堆記憶體中的值,我們以上面淺複製的例子畫個圖:當b=a進行複製時,其實複製的是a的引用地址,而並非堆裡面的值。而當我們a[0]=1時進行陣列修改時,由於a與b指向的是同一個地址,所以自然b也受了影響,這就是所謂的淺複製了。那,要是在堆記憶體中也開闢一個新的記憶體專門為b存放值,就像基本型別那樣,起步就達到深複製的效果了