手寫深拷貝及深拷貝理解
前言
- 淺拷貝與深拷貝的關系
- 為什么使用深拷貝,深拷貝是干什么的?
淺拷貝
與深拷貝相對應的就是淺拷貝,淺拷貝就是直接賦值;在很多情況下我們都需要給變數賦值,給記憶體地址賦予一個值,而在賦值參考型別時,只是共享一個記憶體區域,導致賦值的時候,還跟之前的值保持一至性,
var text1 = {
a:1,
b:2
}
var text2 = text1
text2.a = 2
console.log(text1.a) // 2
console.log(text2.a) // 2
就如上面代碼中直接給 text2 賦值 text1 只要改變 text2 的值,那么 text1 的值也會改變,那么這就要使用到我們的深拷貝,深拷貝就是給變數新建一個堆記憶體空間利用遞回把資料賦值過去,
正文
要使用深拷貝那么就得先判斷資料型別,確保是參考型別,因為資料型別不需要,
var obj = {
name: '三石',
age: '20',
loveColor: 'black',
hobby: {
game: 'LOL',
movement: 'running'
},
game:['CF',"CS"]
}
var newObj = deepClone(obj)
newObj.wocao[0]= "哈哈哈"
console.log(obj)
console.log(newObj)
//深拷貝
function deepClone(obj) {
// 判斷obj是不是個物件或者是不是undefined
//如果obj不是個物件或者是 undefined 或 null 直接進行 return
if (typeof obj !== 'object' || obj == null) {
return obj
}
// 初始化一個變數回傳結果
let result
// 判斷obj的型別 然后給result一個一樣的資料型別額
if (obj instanceof Array) {
result = []
} else {
result = {}
}
// 利用for in 遍歷obj
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 下面這個判斷可加可不加 看情況 如果死回圈的話就加上
// 判斷obj【key】是否存在 并且還是參考型別
if(obj[key] && typeof obj[key] === 'object'){
result[key] = deepClone(obj[key])
}else{
result[key] = obj[key]
}
}
}
return result
}
小結
這只是es5的深拷貝寫法,es6跟這個是有些差異,并且這只是深拷貝中的遞回的寫法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271471.html
標籤:其他
上一篇:第六屆藍橋杯省賽C語言B組 題解
下一篇:牛客演算法NC14583
