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

深浅拷贝区别,怎么区别使用

在 JavaScript 中,深拷贝(Deep Copy) 和 浅拷贝(Shallow Copy) 是两种不同的对象复制方式,它们的区别主要体现在对嵌套对象的处理上。以下是它们的详细对比及使用场景:


1. 浅拷贝(Shallow Copy)

  • 定义:

    • 浅拷贝只复制对象的第一层属性,如果属性是基本类型(如 stringnumberboolean),则直接复制值;如果属性是引用类型(如 objectarray),则复制引用(内存地址)。

    • 浅拷贝后的对象和原对象共享嵌套的引用类型数据。

  • 实现方式:

    • 使用 Object.assign():

      const obj = { a: 1, b: { c: 2 } };
      const shallowCopy = Object.assign({}, obj);
    • 使用扩展运算符(...):

      const obj = { a: 1, b: { c: 2 } };
      const shallowCopy = { ...obj };
  • 特点:

    • 修改浅拷贝对象的第一层属性不会影响原对象。

    • 修改浅拷贝对象的嵌套对象属性会影响原对象。

  • 示例:

    const obj = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...obj };
    
    shallowCopy.a = 10; // 修改第一层属性
    shallowCopy.b.c = 20; // 修改嵌套对象属性
    
    console.log(obj); // { a: 1, b: { c: 20 } } (嵌套对象被修改)
    console.log(shallowCopy); // { a: 10, b: { c: 20 } }

2. 深拷贝(Deep Copy)

  • 定义:

    • 深拷贝会递归复制对象的所有层级属性,包括嵌套的引用类型数据。

    • 深拷贝后的对象和原对象完全独立,互不影响。

  • 实现方式:

    • 使用 JSON.parse(JSON.stringify()):

      const obj = { a: 1, b: { c: 2 } };
      const deepCopy = JSON.parse(JSON.stringify(obj));
      • 注意:这种方法无法复制函数、undefinedSymbol 等特殊类型。

    • 使用递归函数或工具库(如 Lodash 的 _.cloneDeep):

      const _ = require('lodash');
      const obj = { a: 1, b: { c: 2 } };
      const deepCopy = _.cloneDeep(obj);
  • 特点:

    • 修改深拷贝对象的任何属性都不会影响原对象。

    • 深拷贝会完全复制对象的所有层级数据。

  • 示例:

    const obj = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(obj));
    
    deepCopy.a = 10; // 修改第一层属性
    deepCopy.b.c = 20; // 修改嵌套对象属性
    
    console.log(obj); // { a: 1, b: { c: 2 } } (原对象不受影响)
    console.log(deepCopy); // { a: 10, b: { c: 20 } }

3. 浅拷贝和深拷贝的区别

特性浅拷贝(Shallow Copy)深拷贝(Deep Copy)
复制层级只复制第一层属性递归复制所有层级属性
嵌套对象嵌套对象是引用(共享内存地址)嵌套对象是独立的(不共享内存地址)
性能性能较高性能较低(递归复制)
实现方式Object.assign()、扩展运算符JSON.parse(JSON.stringify())、递归函数、工具库
适用场景对象结构简单,无需复制嵌套对象对象结构复杂,需要完全独立的对象

4. 如何选择使用浅拷贝和深拷贝

  • 使用浅拷贝的场景:

    • 对象结构简单,没有嵌套对象或数组。

    • 只需要复制第一层属性,且不关心嵌套对象是否共享。

    • 性能要求较高,且不需要完全独立的对象。

  • 使用深拷贝的场景:

    • 对象结构复杂,包含嵌套对象或数组。

    • 需要完全独立的对象,修改拷贝对象不影响原对象。

    • 不关心性能开销,且需要完整的复制。


5. 总结

  • 浅拷贝:

    • 只复制第一层属性,嵌套对象是引用。

    • 适合简单对象或性能敏感的场景。

  • 深拷贝:

    • 递归复制所有层级属性,嵌套对象是独立的。

    • 适合复杂对象或需要完全独立的场景。

根据实际需求选择合适的拷贝方式,可以避免不必要的性能开销和潜在的错误。

相关文章:

  • 最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
  • Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)
  • 解决 ssh connect to host github.com port 22 Connection timed out
  • 重看Spring聚焦BeanDefinition分析和构造
  • LED灯闪烁实验:Simulink应用层开发
  • EtherCAT(四) 从站XML文件描述
  • vite配置scss全局变量
  • 22.4.3.2 TCP/UDP连接信息
  • 深度学习在文本情感分析中的应用
  • java数据结构_优先级队列(堆)_6.2
  • 4. grafana(7.5.17)功能菜单简介
  • 15-最后一个单词的长度
  • 体验用ai做了个python小游戏
  • ECOLOGY流程表单字段由单行文本改成多行文本
  • DeepSeek + Claude 提升效果
  • 当C#邂逅Deepseek, 或.net界面集成deepseek
  • Weblogic 反序列化漏洞深度剖析与复现
  • MouseWithoutBorder鼠标指针闪烁、变大+AltTab有程序执行的问题解决方案
  • 【算法】787. 归并排序
  • 指标管理项目建设的高频问题和解决思路
  • 深入贯彻中央八项规定精神学习教育中央指导组完成进驻
  • 佩斯科夫:俄会考虑30天停火提议,但试图对俄施压无用
  • 印巴战火LIVE丨“快速接近战争状态”?印度袭击巴军事基地,巴启动反制军事行动
  • 理财经理泄露客户信息案进展:湖南省检受理申诉,证监会交由地方监管局办理
  • 马上评|比余华与史铁生的友情更动人的是什么
  • 毗邻三市人均GDP全部超过20万元,苏锡常是怎样做到的?