深拷贝的方式
前言
深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响。
1. JSON.parse(JSON.stringify())
JSON.parse() 把字符串解析成对象,JSON.stringify()把对象解析成字符串
function deepclone(obj) {
let flag = JSON.parse(JSON.stringify(obj))
return flag
}
2. .函数库lodash的_.cloneDeep方法
function deepclone(obj) {
var _ require('loadash')
let flag = _.cloneDeep(obj)
return flag
3. 手写递归的方法(简单版)
function clone(obj) {
if (typeof obj === 'object') {
let cloneTarget = Array.isArray(obj) ? [] : {};
for (const key in obj) {
cloneTarget[key] = obj[i] instanceof Object ? clone(obj[i], map) : obj[i]
}
return cloneTarget;
} else {
return obj;
}
};
4. 手写递归的方法(加强版)
function deepclone(obj, map = new WeakMap()) {
if (obj === null) return obj;
if(obj instanceof RegExp) return new RegExp(obj)
if(obj instanceof Date) return new Date(obj)
// 可能是对象或者普通的值 如果是函数的话是不需要深拷贝
if (typeof obj !== "object") return obj;
if(typeof obj === 'object') {
// 防止循环引用
if(map.get(obj)) return map.get(obj)
// 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
let cloneObj = new obj.constructor();
map.set(obj, cloneObj)
for(let i in obj) {
if(obj.hasOwnProperty(i)) {
cloneObj[i] = obj[i] instanceof Object ? deepclone(obj[i], map) : obj[i]
}
}
return cloneObj
}
}