一、写在前面
深拷贝就是对对象的深度拷贝,假如我们对象中的字段值任然是对象,如果使用浅拷贝,则只能拷贝对象的地址。实现深拷贝存在三种方法:
1、
使用JSON.stringify
和JSON.parse
方法
2、
手写一个深拷贝函数。
3、
使用第三方库lodash
。
下面我们将详细总结一下第一种和第二种。
二、JSON.stringify和JSON.parse方法
const obj = {name: 'Jack',address: {x: 100,y: 200}
}
let copyObj = JSON.parse(JSON.stringify(obj))
console.log(copyObj) //{ name: 'Jack', address: { x: 100, y: 200 } }
console.log(copyObj.address === obj.address) //false
三、手写深拷贝函数
function deepCopy(obj, cache = new WeakMap()) {if (obj === null || typeof obj !== 'object') return obj //原始值if (obj instanceof Date) return new Date(obj) //日期值if (obj instanceof RegExp) return new RegExp(obj) //正则if (cache.has(obj)) return cache.get(obj) //防止循环引用情况let copyObj = new obj.constructor() //创建一个和obj类型一样的对象cache.set(obj, copyObj) //放入缓存中for (let key in obj) {if (obj.hasOwnProperty(key)) {copyObj[key] = deepCopy(obj[key], cache)}}return copyObj
}const obj = {name: 'Jack',address: {x: 100,y: 200}
}
obj.a = obj
let copyObj = deepCopy(obj)
console.log(copyObj)
console.log(copyObj.address === obj.address) //false