如何实现深浅拷贝?

        一、理解深浅拷贝

        调用一次构造函数,调用两次析构函数,两个对象的指针成员所指内存相同,name指针被分配一次内存,但是程序结束时该内存却被释放了两次,会造成内存泄漏问题!

这是由于编译系统在我们没有自己定义拷贝构造函数时,会在拷贝对象时调用默认拷贝构造函数,进行的是浅拷贝!即对指针name拷贝后会出现两个指针指向同一个内存空间。

所以,在对含有指针成员的对象进行拷贝时,必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间,即进行深拷贝,这样就避免了内存泄漏发生。

        二、浅拷贝(引用数据类型(数组,对象))

       浅拷贝只复制指向某个对象的指针而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

        可以通过ES6中的展开修饰符...来进行浅拷贝。

注意:...不是深拷贝,但是可以深拷贝第一层。

废话不多说,写一个例子

 var info = {
        name:'Tom',
        age:18
 }

var info2 = { ...info }

//修改下name属性
info.name = "Jack"

console.log(info2)

//这直接会把本身name:"Tom"打印出来,这就实现了浅拷贝

        三、深拷贝

        深拷贝用的比较多的就是   先转换位字符串,JSON.stringify 再把字符串转换为一个对象  JSON.parse。

        但是 null,function,undefined 拷贝不了

var info = {
        name:'张三',
        age:18,
        obj:{
            title:'我是标题',
        }
    }

info.obj.title = "我把标题修改了~~"
var info2 = JSON.parse(JSON.stringify(info))
//这样实现深拷贝

也可以用...实现深拷贝

var info = {
        name:'张三',
        age:18,
        obj:{
            title:'我是标题'
        }
    }
info.obj.title = "我把标题修改了~~"

var info2 = {
    ...info, //先把info的内容展开
    obj:{ ...info.obj }    //然后展开 obj对象中的内容
}


//这样也可以实现深拷贝

     

你可能感兴趣的:(如何实现深浅拷贝,javascript)