回覆列表
  • 1 # pzyyo24296

    簡單點來說,就是假設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存放值,就像基本型別那樣,起步就達到深複製的效果了

  • 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存放值,就像基本型別那樣,起步就達到深複製的效果了

  • 中秋節和大豐收的關聯?
  • 紅棗枸杞泡白酒能有什麼效果啊?