深克隆和浅克隆

什么是浅克隆和深克隆?

首先,克隆只针对数组,对象,函数等复杂数据类型。

浅克隆:就是将栈内存中的引用复制一份,赋给一个新的变量,本质上两个指向堆内存中的同一地址,内容当然也相同,其中一个变化另一个内容也会变化(根本上改变的是同一个对象)。

深克隆:就是创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全变成两个互不相关的对象。

上代码演示:


const a = new Array;
a[0] = "张三";
a[1] = "李四";
a[2] = "王五";
b = a;
alert(b)   // 张三,李四,王五

这里定义一个数组a ,然后向a添加3个元素,再把a赋给变量b,输出b得到的内容与a相同。

因为在这段代码在创造的新数组Array被放在堆内存中,而a,b为地址,被存放在栈内存中,此时a,b都指向Array。
这里就是一个简单的浅克隆的例子,把数组array的引用复制一份给b,让两个变量都指向Array。这时候任意一个引用对array做出的修改都会折射到另一个引用上。

深克隆的方法?

说白了深克隆的本质就是创造一个完全一样的对象,但是和被克隆对象都是两个完全独立的对象,改变一个不能影响另一个。

这里介绍两种深克隆的方法:

递归完成深克隆

function deepClone(arr) {
  if (typeof arr != "object") {
    return arr;
  }
  var result = {};
  for (var i in arr) {
    result[i] = deepClone(arr[i]);
  }
  return result;
}

首先判断元素类型是否是object(注意数组的类型也是object)如果不是就无法克隆,然后创建一个对象赋给result。然后遍历arr中所有的元素,递归判断是否是深层对象,不是返回赋给result。这样就实现了深克隆。

下面通过代码测试一下

 var a = {
            name: "张三",
            age: "22",
            sister: {
                name: "李四",
                age: "33"
            }
        }


        var arrTwo = a;
        var arrThree = deepClone(a);
        arrThree.name = "王五";
        arrThree.sister.name = "赵六";

        console.log(arrTwo);
        console.log(arrThree);

输出结果:
在这里插入图片描述

这里可以看到在对原数组操作时,克隆返回的数组内容不会改变。两个数组是完全不同的两个对象,在堆内存中各占一块,没有关联。

利用json方法(JSON.parse( )和JSON.stringify( )

还是上面的例子,仅改变一行代码也可实现深克隆。

        var a = {
            name: "张三",
            age: "22",
            sister: {
                name: "李四",
                age: "33"
            }
        }


        var arrTwo = a;
        // var arrThree = deepClone(a);
        var arrThree = JSON.parse(JSON.stringify(arrTwo));
        arrThree.name = "王五";
        arrThree.sister.name = "赵六";

        console.log(arrTwo);
        console.log(arrThree);

JSON.parse() :于从一个字符串中解析出json对象

        var str = '{"name":"huangxiaojian","age":"23"}'
        console.log(JSON.parse(str));

在这里插入图片描述

JSON.stringify() : 用于从一个对象解析出字符串

        var a = {a:1,b:2}
        console.log(JSON.stringify(a));

在这里插入图片描述

总结

所谓深克隆就是创造一个完全一样的对象,将原对象的的所有元素拷贝过来即可。
浅克隆就是复制一份引用,所有引用指向同一份数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值