登录
首页 >  文章 >  前端

深拷贝与浅拷贝区别全解析

时间:2025-12-09 08:55:44 308浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

对于一个文章开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《对象拷贝:深拷贝与浅拷贝区别详解》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

浅拷贝只复制对象第一层属性,嵌套对象共享引用,修改会影响原对象;深拷贝递归复制所有层级,生成完全独立副本。常用浅拷贝方法有Object.assign、扩展运算符;深拷贝可用JSON.parse(JSON.stringify())、递归实现或Lodash的cloneDeep。

对象拷贝:深拷贝与浅拷贝实现方案

在JavaScript中,对象拷贝是一个常见需求。根据是否复制对象内部引用的数据,分为浅拷贝深拷贝。理解两者的区别并掌握实现方式,对开发至关重要。

浅拷贝:只复制第一层属性

浅拷贝创建一个新对象,将原对象的可枚举属性复制过来,但如果属性值是引用类型(如对象或数组),则只复制引用地址,不会递归复制其内容。这意味着修改嵌套对象会影响原对象。

常见的浅拷贝方法包括:

  • Object.assign():将多个源对象合并到目标对象
  • 扩展运算符(...):语法简洁,适合日常使用
  • for...in 循环手动赋值:兼容性好,可控性强
示例:
const obj = { a: 1, b: { c: 2 } };
const copy = { ...obj };
copy.b.c = 3;
console.log(obj.b.c); // 输出 3,说明共享引用

深拷贝:完全独立的副本

深拷贝会递归复制对象的所有层级,生成一个与原对象完全独立的新对象。修改拷贝后的对象不会影响原始对象。

实现深拷贝有多种方案,各有优劣:

  • JSON.parse(JSON.stringify(obj)):简单快捷,但有明显限制,比如不支持函数、undefined、Symbol、循环引用等
  • 递归实现:手动遍历对象属性,对引用类型继续调用深拷贝函数,能处理大多数情况
  • 结构化克隆算法(Structured Clone):浏览器原生支持,可通过MessageChannel或postMessage实现,比JSON更强大
  • 第三方库(如 Lodash):提供成熟的 _.cloneDeep 方法,兼容性好,功能全面
简易递归深拷贝示例:
function deepClone(obj, seen = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (seen.has(obj)) return seen.get(obj); // 处理循环引用

  const clone = Array.isArray(obj) ? [] : {};
  seen.set(obj, clone);

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key], seen);
    }
  }
  return clone;
}

选择建议

实际开发中应根据场景选择合适方式:

  • 若对象结构简单且不含函数、日期等特殊类型,JSON方法足够用
  • 需要完整支持各种数据类型时,推荐使用Lodash 的 cloneDeep
  • 追求无依赖可使用递归+WeakMap实现,注意处理边界情况
  • 浅拷贝适用于临时扩展对象、避免直接修改原对象的一层属性
基本上就这些。关键在于清楚自己操作的数据结构,避免因共享引用导致意外修改。

今天关于《深拷贝与浅拷贝区别全解析》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>