当前位置: 首页 > news >正文

JavaScript深拷贝与浅拷贝:区别及实现方法详解

在JavaScript中,深拷贝和浅拷贝是两种不同的对象复制方式,它们的主要区别在于复制过程中是否创建了新的对象实例以及是否递归地复制了对象中的所有属性(包括嵌套对象)。

浅拷贝

浅拷贝是指创建一个新的对象,这个新对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型(比如字符串、数字、布尔值),拷贝的就是值本身。但如果属性是引用类型(比如对象、数组),拷贝的就是内存地址,即指向同一个对象。因此,如果修改了新对象中的某个引用类型属性,原始对象中的对应属性也会受到影响。

JavaScript中常见的浅拷贝方法包括:

  • Object.assign()
  • 展开运算符(...

深拷贝

深拷贝是指创建一个新的对象,并且递归地复制原始对象中的所有属性(包括嵌套对象),使得新对象和原始对象完全独立。修改新对象中的任何属性都不会影响原始对象。

JavaScript中实现深拷贝的方法有多种,以下是几种常见的方式:

  1. 使用JSON对象

    这种方法简单直接,但有一些限制,比如无法复制函数、undefinedSymbol等,也无法处理循环引用。

    const deepCopy = JSON.parse(JSON.stringify(originalObject));
    
  2. 递归拷贝

    通过递归函数手动实现深拷贝,可以处理更复杂的对象和情况,但需要编写额外的代码。

    function deepCopy(obj, hash = new WeakMap()) {if (Object(obj) !== obj || obj === null) {return obj; // 处理原始值和非对象}if (hash.has(obj)) {return hash.get(obj); // 处理循环引用}let copy;if (Array.isArray(obj)) {copy = [];hash.set(obj, copy);for (let i = 0; i < obj.length; i++) {copy[i] = deepCopy(obj[i], hash);}} else {copy = {};hash.set(obj, copy);for (const key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {copy[key] = deepCopy(obj[key], hash);}}}return copy;
    }
    
  3. 使用第三方库

    lodash_.cloneDeep()方法,可以方便地实现深拷贝,但会增加项目的依赖。

    const _ = require('lodash');
    const deepCopy = _.cloneDeep(originalObject);
    

选择哪种方法取决于具体的需求和场景。如果对象结构比较简单且没有特殊类型(如函数、循环引用等),使用JSON对象的方法可能足够。如果需要处理更复杂的情况,递归拷贝或第三方库可能是更好的选择。


http://www.mrgr.cn/news/69854.html

相关文章:

  • C++初阶——list
  • React diff算法和Vue diff算法的主要区别
  • docker之容器设置开机自启(4)
  • Android Studio 运行模拟器无法打开avd
  • 瞧瞧别人家的异常处理,那叫一个优雅!
  • Docker了解
  • 【计算机架构】什么是 ROM
  • GPIO 唤醒深度睡眠的esp32-c3
  • CouchdbH2database未授权
  • arkUI:相对布局(RelativeContaine)
  • 环形链表问题(图 + 证明 + 题)
  • Kruskal和Prim
  • 【前端打包必看】webpack入口与出口配置全解析(8)
  • c++常用的新特性-->day04
  • 布耗!对面是炸鱼的!!快让我的18岁舍友直接帮我拿下对局——如何用HarmonyOS鸿蒙操作系统实现自由流转
  • 软考设计师2024下回忆
  • 【C++】新手入门指南
  • MATLAB和R及Python伪时间分析
  • OJ算法练习(双指针篇)
  • 网络入门基础
  • 餐饮小程序的生意模式渠道发展
  • CMS垃圾收集器和G1垃圾收集器详解
  • 24/11/10 算法笔记 强化学习A3C
  • 零基础友好:柑橘果实成熟度分割
  • 农业科技创新引领新时代,农业强国梦想触手可及!
  • 探索 Linux 系统:开源世界的璀璨明珠