请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

浅拷贝和深拷贝,想请教一下老师,深拷贝中利用weakMap为什么可以解决循环应用的问题??

/**
         * 浅拷贝和深拷贝是针对复杂数据类型的
         * 浅拷贝可以通过扩展运算符{...}和Object.assgin来实现
         * 对于复杂类型来说,浅拷贝后新对象和旧对象指向的是同一块内存地址
         */
        let obj1 = {
            name: 'lucy',
            age:18,
            hobbies:['reading','sing','draw']
        }
        let obj2=Object.assign({},obj1);
        let obj3={...obj1};
        obj1.hobbies.push('dance');
        console.log(obj1); //{name:'lucy',age:18,hobbies:['reading','sing','draw','dance']}
        console.log(obj2);//{name:'lucy',age:18,hobbies:['reading','sing','draw','dance']}
        console.log(obj3); //{name:'lucy',age:18,hobbies:['reading','sing','draw','dance']}
 /**
         *深拷贝后的两个对象之间是相互隔离的,对一个对象的修改并不会影响到另外一个对象
         *JSON.parse(JSON.stringify())的缺点是:
         *对象的属性值是函数时,无法拷贝。
         *原型链上的属性无法拷贝
         *不能正确的处理 Date 类型的数据
         *不能处理 RegExp
         *会忽略 symbol
         *会忽略 undefined
         */
        let obj1 = {
            name: 'lucy',
            age:18,
            hobbies:['reading','sing','draw']
        }
       let obj2=JSON.parse(JSON.stringify(obj1));
       obj1.hobbies.push('dancing');
       console.log(obj1);//{name:'lucy',age:18,hobbies:['reading','sing','draw','dancing']}
       console.log(obj2);//{name:'lucy',age:18,hobbies:['reading','sing','draw']}

 function deepClone(obj,hash=new WeakMap){
     //如果是正则对象直接返回
     if(obj instanceof RegExp) return new RegExp(obj);
     //如果是日期对象也直接返回
     if(obj instanceof Date) return new Date(obj);
     //如果不是复杂数据类型直接返回
     if(obj===null || typeof obj!=="object") return obj;
     /*
     * 如果obj是数组,那么obj.constructor=[Function:Array]
     * 如果obj是对象,那么obj.constructor=[Function:object]
     */
     let t=new obj.constructor();
     hash.set(obj,t);
     for(let key in obj){
         //对象本身上存在这个键
         if(obj.hasOwnProperty(key)){
             //将这个键所对应的值重新进行深拷贝
             t[key]=deepClone(obj[key],hash);
         }
     }
     return t;
    }

正在回答 回答被采纳积分+3

1回答

双越 2020-06-17 08:22:19

首先,你是否了解:什么是深拷贝中的循环引用问题?

0 回复 有任何疑惑可以回复我~
  • 提问者 慕婉清9221589 #1
    循环引用是指两个对象互相调用属性形成一种循环
    回复 有任何疑惑可以回复我~ 2020-06-17 20:22:06
  • 双越 回复 提问者 慕婉清9221589 #2
    对呀,那用 Weakmap判断一下,不正好吗。
    回复 有任何疑惑可以回复我~ 2020-06-17 21:22:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信