深拷贝的方式

前言

深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响。

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
  }
}
全部评论

相关推荐

逆流河上万仙退:我觉得佬没必要 学历在这里 去了也不会对履历有很大提升 只是有可能让自己更熟练 是我的话会更倾向于找暑期或者中大厂日常
查看13道真题和解析
点赞 评论 收藏
分享
04-18 00:32
已编辑
中南大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务