js中的深浅拷贝理解

浅拷贝,通俗理解就是拷贝一层,例如{a:1,b:{c:1,d:2}},那么拷贝的是a,b指向的内存的位置;由于b指向的是一个对象的引用,那么,我对原来对象中的c属性进行修改,也会影响到新对象属性的值;但是修改原来对象中a的值,就不会影响后新对象a的值;

那么如何实现浅拷贝呢?

  function simpleClone(obj,newObj) {
            if(typeof obj!=="object"){
                return ;
            }
            for(let prop in obj){
                // 如果传入的对象有该属性并且不是继承的
                if(obj.hasOwnProperty(prop))
                {
                    newObj[prop] = obj[prop];
                }                
            }
            return newObj;
        }

那么如何实现深拷贝呢?

 let arr = {a:1,b:2,c:3,d:4,e:{ad:1,ac:2},f:[1,2]};
function deepClone(obj,newObj={}) {
           for(let prop in obj){
               if(obj.hasOwnProperty(prop)){
                   // 判断遍历出来的object[prop]是否是object类型,并且不为空
                   if(typeof obj[prop]==="object" && obj[prop]!==null){
                       console.log(obj[prop].constructor.name);
                       newObj[prop] = obj[prop].constructor.name === "Array"? []:{};
                       deepClone(obj[prop],newObj[prop])
                   }else{
                       newObj[prop] = obj[prop];
                   }
               }
           }
           return newObj
        }
            let arr3 = deepClone(arr);
            console.log(arr3 === arr);
            arr.e.ad = 99;
            console.log(arr3.e.ad)//=>1;

其实还有简便的方法:

浅拷贝:Object.assign(obj,obj1,obj2)

深拷贝:JSON.parse(JSON.stringfy(obj)),方便又快捷,只是遇到事件时比较难处理;

先学难的再学简单的,提高自己的代码能力!

猜你喜欢

转载自blog.csdn.net/m0_38005587/article/details/84799455