拷贝:浅拷贝与深拷贝-简单易懂

一、浅拷贝

首先深浅拷贝只针对引用类型

浅拷贝:拷贝的是地址

常见方法:

1.拷贝对象:Object.assgin()/展开运算符{...obj}拷贝对象

2.拷贝数组:Array.prototype.concat()或者【...arr】

问题:如果简单数据类型拷贝的是值,引用数据类型拷贝的是地址

<script>
   const obj={
    name:'oo',
    age:18
   }
  //方法一 浅拷贝
  const o={...obj}
  console.log(o)
  //方法二 
  const b={}
  Object.assign(b,obj)
  console.log(b)
</script>

二、深拷贝

深拷贝:拷贝的是对象,不是地址

常见方法:

1.通过函数递归实现深拷贝(遇到数组、对象在使用递归,先array在数组)

2.lodash/cloneDeep

3.通过JSON.stringify()实现

三、递归实现深拷贝

函数递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

简单理解:函数内部自己调用自己,这个函数就是递归函数

由于递归函数容易发送“栈溢出”错误,所以必须要加退出条件return

       <script>
        const obj = {
            uname: 'pink',
            age: '18',
            hobby:['乒乓球','足球'],
            family:{
                baby:'小'
            }
        }
        const o = {}
        //拷贝 
        function deepCopy(newObj, oldObj) {
            for (let k in oldObj) {
                //处理数组问题
                if(oldObj[k] instanceof Array){
                   newObj[k]=[]
                   //newObj[k] 接受 []
                   //oldObj[k] ['乒乓球','足球']
                   deepCopy(newObj[k],oldObj[k])
                }
                //处理集合问题
                else if(oldObj[k] instanceof Object){
                    newObj[k]={}
                   deepCopy(newObj[k],oldObj[k])
                }
                else{
                   //k 属性名  oldObj[k] 属性值 18
                   //newObj[k] === o.uname
                    newObj[k] = oldObj[k]
                }
            }
        }
        deepCopy(o, obj) //函数调用 两个参数 o是新对象 obj旧对象
        console.log(o)
        o.hobby[0]='篮球'
        o.age = 20
        o.family.baby='老pink'
        console.log(obj); //无影响
    </script>

四、js库lodash里面cloneDeep内部实现了深拷贝

    <!-- 先引用 -->
    <script src="./lodash.min.js"></script>
    <script>
         const obj={
            uname:'pink',
            age:'18',
            hobby:['乒乓球','足球'],
            family:{
                baby:'小pink'
            }
         }
         const o=_.cloneDeep(obj)
    </script>

五、JSON.stringify() 字符串转换

    <script>
         const obj={
            uname:'pink',
            age:'18',
            hobby:['乒乓球','足球'],
            family:{
                baby:'小pink'
            }
         }
         //把对象转换为JSON字符串
        console.log(JSON.stringify(obj))
        //字符串转换成对象
        const o=JSON.parse(JSON.stringify(obj))
        console.log(o)
    </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值