javascript中的深拷贝与浅拷贝的区别

深拷贝与浅拷贝
1.浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;
2. 深拷贝:复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变;
实现深拷贝一般有两种方式:
(1)递归
(2)JSON.stringify结合JSON.parse的方式

浅拷贝 指向的都是一个地址(只是将地址指向同一个,而不是真正意 义上的拷贝)

    const a = [0,1,2,3,4]
    const b = a
    a[0] = 1
    console.log(a,b);
    //结果:
    //a:1,1,2,3,4,5
    //b:1,1,2,3,4,5
    //浅拷贝:b复制了a,改变b,a也会随着改变。(a与b指向的是同一个地址,所以b也受了影响)

深拷贝 递归方式

     function deepClone(obj) {
         //Array.isArray() 用于确定传递的值是否是一个 Array
         let objClone = Array.isArray(obj) ? [] : {};
         if (obj && typeof obj === 'object') {
             for (key in obj) {
                 //判断ojb子元素是否为对象,如果是,递归复制
                 if (obj[key] && typeof obj[key] === "object") {
                     objClone[key] = deepClone[obj[key]]
                 } else {
                     //如果不是,简单复制
                     objClone[key] = obj[key];
                 }
             }
         }
         return objClone;
     }

     let _obj = {0:'小明',1:'小红',2:'小鹿'},
     _obj2 = deepClone(_obj);
     _obj[0] = "张飞"
     console.log(_obj,_obj2);
     //结果:
     //_obj:{0: "张飞", 1: "小红", 2: "小鹿"} 
     //_obj2:{0: "小明", 1: "小红", 2: "小鹿"}
     //深拷贝:_obj2复制了_obj,改变_obj,不会改变_obj2(开辟一个新的内存空间,修改新对象,旧对象保持不变)

深拷贝 JSON.stringify结合JSON.parse的方式

         function deepClone(obj) {
             const _obj = JSON.parse(JSON.stringify(obj))
             return _obj
         }
         let a = [0,1,2,3,4]
         b = deepClone(a)
         a[0] = 1
         console.log(a,b);
        //结果:
        //a:1,1,2,3,4,5
        //b:0,1,2,3,4,5
        //深拷贝:b复制了a,改变a,不会改变b(开辟一个新的内存空间,修改新对象,旧对象保持不变)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值