淺拷貝和拷貝的概念和實現

2021-09-19 13:24:12 字數 1872 閱讀 7128

一.從簡單型別和複雜型別資料的儲存來認識深拷貝

二.區分常用操作是深拷貝還是淺拷貝:

1.= 賦值

不論是簡單的物件或陣列還是複雜的物件或陣列,都是淺拷貝

以簡單陣列示例:

let arr = [1, 2, 3]

let newarr = arr

newarr[0] = 0

console.log(arr[0]) // 0

2.迴圈賦值

簡單的物件或陣列可以實現深拷貝,複雜的物件或陣列,內部的複雜型別資料是淺拷貝

以物件示例:

let obj =

let newobj = {}

for (let i in obj)

newobj.key1 = 0

newobj.key2[0] = 0

console.log(obj.key1) // 1 簡單型別資料實現了深拷貝

console.log(obj.key2[0]) // 0 複雜型別資料是淺拷貝

注意:如果直接將複雜資料型別整體替換,則互不影響

newobj.key2 =

console.log(obj.key2) // [1, 2, 3]

3.object.assign(newobj, obj)(es6)和迴圈賦值相同

三.深拷貝實現

1.不含函式的物件可以使用json.parse()和json.stringify()進行深拷貝(函式鍵值對會忽略)

let obj = 

}let newobj = {}

newobj = json.parse(json.stringify(obj))

newobj.key1 = 0

newobj.key2.key2_key1 = 0

console.log(obj.key1) // 1

console.log(obj.key2.key2_key1) // 2

2.迴圈遞迴

物件的屬性值不會引用外層物件的情況(否則會進入死迴圈):

function deepcopy(obj) 

if (obj && typeof obj === "object") else }}

} return newobj

}

deepclone (obj) 

for (var key in obj)

return _obj

} else if (object.prototype.tostring.call(obj) === '[object array]')

return _obj

} else

} else

}

包含物件的屬性值引用外層物件的情況:

function deepcopy(obj) 

if (obj && typeof obj === "object")

if (obj.hasownproperty(i))

arguments.callee(prop, newobj[i]) // 遞迴呼叫

} else }}

}return newobj

}

參考:一篇文章徹底說清js的深拷貝/淺拷貝

js深拷貝和淺拷貝的實現

JS 深拷貝和淺拷貝概念,以及實現深拷貝的三種方式

1 堆疊 棧 stack 系統自動分配的記憶體空間,記憶體會由系統自動釋放,用來存放函式的引數值,區域性變數的值等,特點是先進後出。堆 heap 系統動態分配的記憶體,記憶體大小不一,記憶體不會自動釋放。一般由程式設計師分配釋放,主要負責像obejct這種變數型別的儲存。2 基本資料型別 概念 存放...

js實現深拷貝和淺拷貝

let obj let newobj obj.age.age 25 修改第二層的obj.age.age,newobj.age.age也會跟著變化 console.log newobj 複製 注意 資料的slice和concat方法也是淺拷貝,只能拷貝一層 原理 把乙個物件轉化成乙個字串,再把這個字串...

深拷貝和淺拷貝 具體實現

我們先來說一下淺拷貝 var obj var b obj console.log b 輸出結果為1 這就是淺拷貝 但是淺拷貝會存在乙個問題,我們可以通過 來看一下 var obj var b obj console.log b 我們上面通過淺拷貝拷貝了乙個引用型別,如果我們去修改obj會怎麼樣?va...