深拷贝,浅拷贝

1.浅拷贝

  一个浅拷贝的变量发生变化其他变量的值会随之改变。意思是没有多盖房子而是好多人都有房子的使用权。

浅拷贝场景:

1.等号赋值

let arr = [1, 2, 3, 4];
let newArr = arr;

2.标准内置对象赋值操作

 2.深拷贝

  反之,一个深拷贝的变量发生变化其他变量的值不会会随之改变。意思是一直在盖房子,一个人一个房子的使用权。

深拷贝方法

1.structuredClone(),缺点:浏览器兼容性不完全

const original = { name: "MDN" };
original.itself = original;

// Clone it
 const clone = structuredClone(original);

2.手写深拷贝方法

function deepClone(o, map = new Map()) {
    // console.log('map===,map', map);
    const { isAble, value } = isAbleDeepClone(o)
    // 如果不是可以深拷贝的参数 直接返回出去
    if (!isAble) return value
    // 判断参数是否循环引用  识别当前参数是否引用了
    const key = map.get(o)
    /* 
    如果拿到参数对应的value,也就是说原对象的key(当前递归参数),
    指向了当前对象,出现了循环引用,直接return ,避免递归循环
    */
    if (key) {
        console.log('========出现循环引用=====');
        return key
    }
    const target = new o.constructor(); // 创建被拷贝的对象实例---{}
    map.set(o, target) // 每次set进去的key是参数o,value也是参数o
    for (const k in o) {
        target[k] = deepClone(o[k], map)
    }
    return target
}
// 判断是否是对象或者数组 保证深拷贝可以进行下去
function isAbleDeepClone(o) {
    const typeStr = Object.prototype.toString.call(o)
    if (typeStr === '[object Undefined]' || typeof o !== 'object') return { isAble: false, value: o }
    if (typeStr === '[object Date]') return { isAble: false, value: new Date(o) }
    if (typeStr === '[object RegExp]') return { isAble: false, value: new RegExp(o) }
    if (typeStr === '[object Array]') return { isAble: true }
    if (typeStr === '[object Object]') return { isAble: true }
}

3.JSON.stringify()

function cloneJson(o) {
    /* 
    undefined、任意的函数以及 symbol 值,
    在序列化过程中会被忽略(出现在非数组对象的属性值中时),
    或者被转换成 null(出现在数组中时)。
    函数、undefined 被单独转换时,会返回 undefined,
    如:JSON.stringify(function(){}) or JSON.stringify(undefined).
    */
    return JSON.parse(JSON.stringify(o))
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包装类的深拷贝浅拷贝是指在复制一个包装类对象时,对于其中的字段如何进行复制的过程。 浅拷贝是指只复制值类型字段的值,而对于引用类型字段,只复制其引用。也就是说,新创建的对象和原始对象会共享一部分内存空间,导致对其中一个对象进行修改会影响到另一个对象。 深拷贝是指除了复制值类型字段的值外,还会对引用类型字段所指向的对象进行一次完全的拷贝。也就是说,新创建的对象会有自己独立的一份内存空间,对其中一个对象进行修改不会影响到另一个对象。 实现深拷贝的方法有多种。其中一种常用的方法是利用反序列化技术,通过将对象序列化为字节流,然后再将字节流反序列化为一个全新的对象。这种方法可以解决多层套娃式的深拷贝问题,并且效果非常好。 另外一种实现深拷贝的方式是通过覆写对象的clone()方法,实现引用对象的深度遍历式拷贝。这种方式需要对clone()方法进行重写,以便对引用对象进行递归拷贝。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Java】深拷贝浅拷贝(Java实现)](https://blog.csdn.net/hhb442/article/details/128801265)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值