一.從簡單型別和複雜型別資料的儲存來認識深拷貝
二.區分常用操作是深拷貝還是淺拷貝:
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...