淺拷貝
// 淺拷貝
function shallow(obj) {const newObj = {}for (const key in obj) {// 保證 key 不是原型的屬性if (obj.hasOwnProperty(key)) {newObj[key] = obj[key]}}return newObj
}
深拷貝
遞歸 O(n^2)
// 深拷貝
function deepClone(obj = {}) {// 如果傳入的是 null,直接返回 nullif (obj === null) return null// 如果不是對象類型(如 number、string 等基本類型),直接返回原值(無需拷貝)if (typeof obj !== "object") return obj// 初始化返回結果let result = Array.isArray(obj) ? [] : {}for (let key in obj) {// 保證 key 不是原型的屬性if (obj.hasOwnProperty(key)) {// 遞歸調用!!!result[key] = deepClone(obj[key])}}return result
}
遞歸+Map,防止循環引用
// 深拷貝
function deepClone(obj = {}, map = new Map()) {// 如果傳入的是 null,直接返回 nullif (obj === null) return null// 如果不是對象類型(如 number、string 等基本類型),直接返回原值(無需拷貝)if (typeof obj !== "object") return obj// 防止循環引用:如果當前對象已經在 map 中存在,則返回之前拷貝的結果if (map.has(obj)) return map.get(obj)// 初始化返回結果let result = Array.isArray(obj) ? [] : {}// 將當前原始對象與拷貝對象建立映射關系,防止后續遞歸中重復拷貝造成死循環map.set(obj, result)for (let key in obj) {// 保證 key 不是原型的屬性if (obj.hasOwnProperty(key)) {// 遞歸調用!!!result[key] = deepClone(obj[key])}}return result
}
手寫深拷貝【JS面試題】視頻
js【詳解】深拷貝 (含 JSON.parse(JSON.stringify(obj)) 的缺陷,5種手寫深拷貝)