浅复制和深复制

浅复制和深复制的区别

我们在对数据类型进行复制时,对于基础数据类型,是不分深复制和浅复制的,都是拷贝了他们的数据,而对数组和对象进行复制时,我们通常复制的,都是该对象的内存地址,而不是它的具体数据,当内存地址的数据改动时,复制到的东西也会变化,如下图

在这里插入图片描述

深复制的方法

  1. JSON.parse(JSON.stringify())

    原理:JSON.stringify把对象转化成字符串,JSON.parse再把字符串转化成对象,这样新的对象就会重新开辟一个栈存放数据,从而实现了深复制。

  2. 利用递归

     var arr = [1, 2, 3]
     var arr2 = clone(arr)
     arr2.push(4)
     console.log(arr, arr2)
     
     function chanceType(obj) {   //检测数据类型的函数
         return Object.prototype.toString.call(obj).slice(8, -1)
     }
     //深复制的函数
     function clone(obj) {
         let newObj, objType = chanceType(obj)   //新建一个复制后的对象,并把obj的数据类型存下来
         if (objType === "Object") {
             newObj = {}            
    
         } else if (objType === "Array") {
             newObj = []
         }
         for (let i in obj) {
             let value = obj[i]     
             if (chanceType(value) === "Object" || chanceType(value) === "Array") {   //如果遍历到的数据类型依然有数组或对象,那么再次调用深复制函数进行递归
                 newObj[i] = clone(value)
             } else {
                 newObj[i] = value
             }
         }
         return newObj
     }
    

在这里插入图片描述
原理:因为即便是对象和数组,他的深层数据也都是基础数据类型,所以我们可以利用递归来一层层的遍历,直到把所有基础数据类型全部复制完成,就完成了深复制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值