如何實現深拷貝和淺拷貝

2021-10-22 23:44:08 字數 1446 閱讀 3452

我們先來說一下淺拷貝:

var obj =

;var b = obj;

console.

log(b)

// 輸出結果為1

但是淺拷貝會存在乙個問題,通過淺拷貝拷貝了乙個引用型別,如果我們去修改obj會怎麼樣?

var obj =

;var b = obj;

// 修改obj裡面的a屬性

obj.a =

2console.

log(b)

// 輸出結果

再來看下乙個問題,如果obj裡面又包含了乙個c物件,然後修改c會怎麼樣?

var obj =};

var b =

for(key in obj)

// 修改 obj的屬性

obj.c.c1 =

2console.

log(b)

// 輸出結果為 }

當我們修改了obj裡面的c物件的時候,b裡面的c也跟著變化了,原因就是,b裡面拷貝的c也是乙個引用型別,從而拷貝的只是乙個位址,並且還有乙個問題,就是我們不知道obj裡面有多少層,可能c1裡面又包含乙個引用型別,並且我們不知道引用型別是物件還是陣列,那麼我們就要解決這個問題,這樣的問題就是深拷貝。

我們可以先利用乙個簡單方式來實現深拷貝:

var obj =};

var str =

json

.stringify

(obj)

var b =

json

.parse

(str)

// 修改 obj的屬性

obj.c.c1 =

2console.

log(b)

我們先將需要拷貝的**利用json.stringify轉成字元轉,然後再利用json.parse將字元轉轉回物件,即完成拷貝。

也可以利用遞迴實現拷貝:思路;

1.我們肯定要定義乙個方法,那麼這個方法最終應該返回乙個深拷貝的資料

2.既然要返回乙個資料,我們首先就要定義乙個資料,但是資料是物件還是陣列?所以需要判斷,如果要拷貝的資料是陣列,即定義乙個陣列,如果是乙個物件,即定義乙個物件

3.方法裡面怎麼拷貝啊?還是一樣的利用for in 迴圈,在迴圈內部,需要判斷,如果是型別是簡單型別,直接拷貝,如果是引用型別,就需要在一次的將引用型別裡面的值取出來

var obj =};

function

deepcopy

(obj)

for(key in obj)

else

}return copy

}var b =

deepcopy

(obj)

console.

log(b)

如何實現陣列深拷貝和淺拷貝?

用js處理資料的時候經常遇到需要保留原資料的情況,有時把資料賦給新的變數並不能解決問題,原因是記憶體中僅保留乙份資料。這時候需要製作乙份資料的副本。只有複雜型別變數 引用型別 存在深拷貝與淺拷貝的問題,而基本型別沒有深拷貝的概念。要弄明白拷貝,首先要明白js中物件的組成。在js中一切例項皆是物件,具...

如何理解深拷貝和淺拷貝

首先我們先記住乙個結論 編譯器自動生成的拷貝構造和賦值運算子是memcpy的乙個過程。例項過程以結構體代替,在c 中struct和class除了預設訪問許可權基本等同。struct teststruct1 int main 拷貝構造直接將onevar的記憶體空間拷貝到twovar的記憶體空間中。考慮...

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...