深拷貝和淺拷貝的區別

2021-10-14 15:14:56 字數 1674 閱讀 6729

一、含義:深拷貝和淺拷貝最根本的區別在於是否真正獲取乙個物件的複製實體,而不是引用。假設b複製了a,修改a的時候,看b是否發生變化:

如果b跟著也變了,說明是淺拷貝,拿人手短!(修改堆記憶體中的同乙個值)如果b沒有改變,說明是深拷貝,自食其力!(修改堆記憶體中的不同的值)

淺拷貝(shallowcopy)只是增加了乙個指標指向已存在的記憶體位址,僅僅是指向被複製的記憶體位址,如果原位址發生改變,那麼淺複製出來的物件也會相應的改變。

深拷貝(deepcopy)是增加了乙個指標並且申請了乙個新的記憶體,使這個增加的指標指向這個新的記憶體。 在計算機中開闢一塊新的記憶體位址用於存放複製的物件。

深拷貝:

1、js

function

deepclone

(obj);if

(obj &&

typeof obj===

"object"

)else}}

}return objclone;

}let a=[1

,2,3

,4],

b=deepclone

(a);a[0

]=2;

console.

log(a,b)

;

2、jq(深拷貝,是拷貝物件各個層級的屬性。jq裡有乙個extend方法也可以拷貝物件,拷貝的不徹底啊,b物件的一級屬性確實不受影響了,但是二級屬性還是沒能拷貝成功,仍然脫離不了a的控制,說明slice根本不是真正的深拷貝。)

let a=[1

,2,3

,4],

b=a.

slice()

;a[0]

=2;console.

log(a,b)

;

3、除了遞迴,我們還可以借用json物件的parse和stringify(附帶說下,json.stringify與json.parse除了實現深拷貝,還能結合localstorage實現物件陣列儲存。)

function

deepclone

(obj)

let a=[0

,1,[

2,3]

,4],

b=deepclone

(a);a[0

]=1;

a[2][

0]=1

;console.

log(a,b)

;

4、除了上面三種方法之外,我們還可以借用jq的extend方法。

$.extend( [deep ], target, object1 [, objectn ] )

deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝

target object型別 目標物件,其他物件的成員屬性將被附加到該物件上。

object1 objectn可選。 object型別 第乙個以及第n個被合併的物件。

let a=[0

,1,[

2,3]

,4],

b=$.

extend

(true,[

],a);a[

0]=1

;a[2]

[0]=

1;console.

log(a,b)

;

深拷貝和淺拷貝的區別

retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...

深拷貝和淺拷貝的區別

一.深拷貝 源物件和副本物件是不同的兩個物件 源物件引用計數不變,副本物件計數器為1 因為是新產生的 至少有一層是物件複製 二.淺拷貝 源物件和副本物件是同乙個物件 源物件 副本物件 引用計數器 1,相當於做一次retain操作 本質 沒有產生新的物件 三.完全複製 對於被複製的物件每一層都是物件複...

深拷貝和淺拷貝的區別

深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件,新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。深拷貝是在引用方面不同,深拷貝就是建立乙個新的和原始欄位的內容相同...