深拷贝和浅拷贝

随手记录,有不足地方大伙们多多提醒

数据类型

原始类型:String、Number、Boolean、Null、Undefined、symbol(es6新增)
引用类型:Object、Arrary

引用类型是保存在内存中的对象,js是不允许直接访问对象内存位置,所以不能直接操作对象所在的内存空间,所以想要该对象只能是对该对象的引用而不是对象的本身

1、浅拷贝对于引用类型是会改变原来的数组

    let hobby = ["打游戏", "喝奶茶", "熬夜"];
    let copyhobby = hobby;
    copyhobby.push("看电影")
    console.log(hobby) //["打游戏", "喝奶茶", "熬夜", "看电影"]
    console.log(copyhobby); //["打游戏", "喝奶茶", "熬夜", "看电影"]

2、使用JSON.parse(JSON.stringify(obj));

 let obj = {
      name: "memory",
      hobby: ["打游戏", "喝奶茶", "熬夜"],
    };
    let copyhobby = JSON.parse(JSON.stringify(obj));
    copyhobby.hobby.push("看电影");
    console.log(obj,"obj"); 
    console.log(copyhobby,"copyhobby"); 

在这里插入图片描述

缺点:如果对象里有function、undefined,JSON.parse(JSON.stringify(obj))深拷贝会把function、undefined丢失

let obj = {
      name: "memory",
      hobby: ["打游戏", "喝奶茶", "熬夜"],
      add:()=>{
        console.log(222)
      },
      sex:undefined
    };
    let copyhobby = JSON.parse(JSON.stringify(obj));
    copyhobby.hobby.push("看电影");
    console.log(obj,"obj"); 
    console.log(copyhobby,"copyhobby"); 

在这里插入图片描述
3、使用递归深拷贝
优点:可以解决JSON.parse(JSON.stringify(obj));有function、undefined丢失问题
缺点:递归判断不好会出现死循环

 let obj = {
      name: "memory",
      hobby: ["打游戏", "喝奶茶", "熬夜"],
      add:()=>{
        console.log(222)
      },
      sex:undefined
    };

    function cloneDeep(obj){
      // 1、判断传参是否为对象或者数组,创建新的空数组或对象,存放数据
      let newObj = obj instanceof Array ? [] :{}
      // 2、遍历参数,
      for(let key in obj){
        // 3、判断属性值是否为object,如果嵌套是进行递归
        if(typeof obj[key] === 'object'){
          newObj[key] = cloneDeep(obj[key])
        }else{
          // 4、如果数据为基本类型,则直接赋值
          newObj[key] = obj[key]
        }
      }
      // 5、最后把存放新的对象返回
      return newObj
    }


    let copyhobby = cloneDeep(obj)
    copyhobby.hobby.push("看电影");
    console.log(obj,"obj"); 
    console.log(copyhobby,"copyhobby");
    

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值