关于深拷贝和浅拷贝你需要了解的内容

这篇具有很好参考价值的文章主要介绍了关于深拷贝和浅拷贝你需要了解的内容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在复制对象或数据结构时使用的两种不同的策略,它们的主要区别在于复制后新旧对象之间的关系以及对嵌套对象的处理方式。

  1. 浅拷贝:

    • 浅拷贝创建一个新对象,并将原始对象的属性值复制到新对象中。

    • 浅拷贝通常是通过复制引用来实现的,例如使用扩展运算符(...)或 Object.assign() 方法。

    • 新对象和原始对象共享相同的引用类型属性(如对象、数组),即新对象中的引用类型属性仍然引用原始对象中的相同对象。

    • 当修改原始对象的引用类型属性时,新对象中的对应属性也会受到影响。同样地,修改新对象的引用类型属性时,原始对象中的对应属性也会受到影响

      以下是一个示例来说明:

      const obj = { foo: 'bar', nested: { prop: 'value' } };
      const clonedObj = { ...obj };
      
      console.log(obj); // { foo: 'bar', nested: { prop: 'value' } }
      console.log(clonedObj); // { foo: 'bar', nested: { prop: 'value' } }
      
      // 修改新对象的引用类型属性
      clonedObj.foo = 'baz';
      clonedObj.nested.prop = 'new value';
      
      console.log(obj); // { foo: 'bar', nested: { prop: 'new value' } }
      console.log(clonedObj); // { foo: 'baz', nested: { prop: 'new value' } }
      
      

      在上述示例中,修改了新对象 clonedObj 的引用类型属性 nested.prop 的值,结果原始对象 obj 中的对应属性也发生了变化。这是因为它们引用的是同一个嵌套对象。

      所以,在浅拷贝中,无论是修改原始对象的引用类型属性还是修改新对象的引用类型属性,双方都会受到影响,因为它们共享相同的引用。如果需要避免这种相互影响,可以使用深拷贝来创建完全独立的对象副本。

  2. 深拷贝:

    • 深拷贝创建一个完全独立的新对象,新对象和原始对象没有任何引用关系。

    • 所有的属性值都被复制到新对象中,包括基本类型和引用类型属性。

    • 当修改原始对象的引用类型属性时,新对象中的对应属性不会受到影响。

    • 深拷贝通常需要递归地复制嵌套对象,确保每个对象都是独立的副本。

    • 深拷贝可以通过手动递归复制、使用第三方库(如 Lodash 的 cloneDeep 方法)或使用 JSON 序列化和反序列化来实现

    • 在 JavaScript 中,有几种方法可以实现对象的深拷贝。下面是其中一些常见的方法:

      1. 手动递归复制:这是一种基本的深拷贝方法,可以递归地复制对象和嵌套的属性。可以通过遍历对象的属性并递归地进行复制来实现。但是,这种方法需要处理循环引用的情况,并且在处理特殊对象类型时可能会有一些问题。

        function deepCopy(obj) {
          if (typeof obj !== 'object' || obj === null) {
            return obj;
          }
        
          let copy = Array.isArray(obj) ? [] : {};
        
          for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
              copy[key] = deepCopy(obj[key]);
            }
          }
        
          return copy;
        }
        
        
      2. 使用 JSON 序列化和反序列化:通过将对象转换为 JSON 字符串,然后再将其转换回对象,可以实现深拷贝。这种方法适用于大多数普通对象,但它无法处理函数、正则表达式和特殊对象类型。

        function deepCopy(obj) {
          return JSON.parse(JSON.stringify(obj));
        }
        
        
      3. structuredClone 是 JavaScript 中的一种深拷贝方法,它可以复制包括对象、数组、函数、日期、正则表达式等在内的各种数据类型,同时还能处理循环引用的情况。structuredClone 主要用于 Web Workers、IndexedDB 和 postMessage 等场景中,用于在不同的上下文之间传递数据副本。以下是使用 structuredClone 方法进行深拷贝的示例:

        const obj = { foo: 'bar' };
        const clonedObj = structuredClone(obj);
        
        console.log(clonedObj); // { foo: 'bar' }
        
        

        需要注意的是,structuredClone 方法是浏览器提供的内置方法,在纯 JavaScript 环境中并不可用。此外,它也无法处理一些特殊对象类型,如 DOM 节点、函数的闭包等。

        如果你在浏览器环境中使用 structuredClone 方法,请确保在支持的浏览器版本中使用,并注意其适用范围和限制。

总结起来,浅拷贝只复制对象的第一层属性,并共享引用类型属性,而深拷贝复制了所有层级的属性,并且新对象和原始对象完全独立,没有引用关系。根据具体的需求和场景,选择适合的拷贝方式是很重要的。需要注意的是,深拷贝可能会更耗费内存和计算资源,特别是在处理大型或嵌套层级深的对象时。文章来源地址https://www.toymoban.com/news/detail-727352.html

到了这里,关于关于深拷贝和浅拷贝你需要了解的内容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++中的深拷贝和浅拷贝介绍

    对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 me

    2024年02月07日
    浏览(49)
  • 【面试刷题】——什么是深拷贝和浅拷贝?

    深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中用来描述对象拷贝的两个概念,特别是在涉及对象包含其他对象(如嵌套数据结构、指针等)的情况下。 浅拷贝是一种简单的拷贝操作,它只复制对象的内容,而不会复制对象所包含的其他对象。如果对象包含指针,浅拷贝

    2024年02月11日
    浏览(29)
  • 关于磁盘需要掌握得知识点

    扇区是数据的存储单元,物理盘是实际的硬盘驱动器,而位图则是记录磁盘阵列中扇区状态的数据结构。它们之间的关系是,物理盘组成了磁盘阵列,位图用于跟踪每个物理盘中的扇区状态。 物理盘是指实际的硬盘驱动器,它们是磁盘阵列中的物理存储设备。在磁盘阵列中,

    2024年02月10日
    浏览(44)
  • 【opencv之cv::Mat数据深拷贝和浅拷贝探讨】

    很多时候写程序除了一个强大的架构,细节也很重要,俗话说的话细节决定成败嘛,在使用cv::Mat做图片处理的时候发现,这个数据类型存在深拷贝和浅拷贝的情况,遂想一探究竟。 假设这里原图数据为matSrc : copy方法 结果 matA = matSrc 浅拷贝 matB(matSrc ) 浅拷贝 matC = matSrc .cl

    2024年02月13日
    浏览(36)
  • 关于汽车信息安全,你想了解的知识点都在这里!

    随着车联网高速发展,汽车智能化、网联化不断加强,汽车信息安全面临着全新的挑战。如果汽车没有得到更好的安全防护,受到的恶意攻击可能增多。因此,打造更坚固的车载信息安全防护尤为重要。 那么,汽车信息安全都面临哪些威胁与挑战呢?提升汽车抗攻击能力的安

    2024年02月07日
    浏览(42)
  • Web 3.0 安全风险,您需要了解这些内容

    随着技术的不断发展,Web 3.0 正在逐渐成为现实,为我们带来了许多新的机遇和挑战。然而,与任何新技术一样,Web 3.0 也伴随着一系列安全风险,这些风险需要被认真对待。在这篇文章中,我们将探讨一些与Web 3.0 相关的安全风险,以便更好地了解并准备应对这些挑战。 We

    2024年02月11日
    浏览(42)
  • Premint工具,作为普通人我们需要了解哪些内容?

    如今加密大环境冷静期,大多数项目自身也陷入启动资金少,宣发困难,新员增量和社区联动无法达到启动规模,圈内名人和打卡社团的高价广告费让小项目方成为第一波韭菜,项目的白名单公售信息无法传递于圈子,于是一个喜闻乐见的好工具Premint及时出现并帮助大量的

    2024年01月17日
    浏览(49)
  • 关于前端的那些知识点

    2024年04月22日
    浏览(38)
  • 关于Redis,你需要学习了解的知识

    关于 Redis ,涵盖多个方面,从基础概念到高级应用,以及最佳实践等。比如以下内容: 认识 Redis: Redis 是什么?它的特点和优势是什么? Redis 的数据结构:字符串、哈希、列表、集合、有序集合、位图等。 安装和配置 Redis: 在不同操作系统上安装 Redis。 配置 Redis 的基本

    2024年02月13日
    浏览(47)
  • 前端开发需要了解的工具集合

    前端开发需要了解的一些工具,这些工具能够帮助你在项目开发中事半功倍。 1. nrm:  npm  registry 管理器 registry :  npm  远程仓库的地址。 由于众所周知的原因, npm  官方仓库在国内特别的慢,所以我们需要用一些替代性方案,一种方案就是切换  npm  registry 到国内的镜像仓

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包