JavaScript 深拷贝与浅拷贝详解

前言

在 JavaScript 开发中,拷贝对象是一个非常常见的操作。

但很多时候你以为"复制成功了",其实只是复制了引用,这就会引发很多 Bug。

所以必须搞清楚:

  • 什么是浅拷贝
  • 什么是深拷贝
  • 常见实现方式有哪些

一、浅拷贝是什么?

浅拷贝只会复制对象的第一层属性。

如果属性值还是对象,那么复制的仍然是引用地址。

ini 复制代码
const obj1 = {
  name: 'Tom',
  info: {
    age: 18
  }
};

const obj2 = { ...obj1 };

obj2.info.age = 20;

console.log(obj1.info.age); // 20

说明obj1.infoobj2.info指向同一个对象。


二、常见浅拷贝方式

1)展开运算符

ini 复制代码
const obj2 = { ...obj1 };

2)Object.assign

ini 复制代码
const obj2 = Object.assign({}, obj1);

这两种都属于浅拷贝。


三、深拷贝是什么?

深拷贝会递归复制对象的每一层,生成完全独立的新对象。

ini 复制代码
const obj1 = {
  name: 'Tom',
  info: {
    age: 18
  }
};

const obj2 = JSON.parse(JSON.stringify(obj1));

obj2.info.age = 20;

console.log(obj1.info.age); // 18

四、JSON 深拷贝的问题

虽然:

javascript 复制代码
JSON.parse(JSON.stringify(obj))

很常见,但它有局限:

  • 不能拷贝函数

  • 不能拷贝 undefined

  • 不能拷贝Symbol

  • 不能处理循环引用

  • DateRegExp 会丢失信息


五、手写一个简单深拷贝

ini 复制代码
function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  const result = Array.isArray(obj) ? [] : {};

  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      result[key] = deepClone(obj[key]);
    }
  }

  return result;
}

六、总结

浅拷贝和深拷贝最核心的区别是:

  • 浅拷贝:只拷贝第一层
  • 深拷贝:递归拷贝所有层级

实际开发中要根据场景选择,不要把浅拷贝误当成深拷贝。

相关推荐
এ慕ོ冬℘゜26 分钟前
前端实战:jQuery实现动态表格渲染与状态切换功能
前端·javascript·jquery
zzzzzz31030 分钟前
react-bits:把酷炫动效从“灵感截图”变成可复用的 React 组件
javascript·react.js·动效
海兰8 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
小磊哥er10 小时前
深入解构Claude Code - 第 7 篇 · 连接外面的世界
javascript·ai编程
小磊哥er10 小时前
深入解构Claude Code - 第 6 篇 · 终端里的图形界面
javascript·ai编程
海兰10 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(一)
javascript·python·金融
可乐鸡翅yeah_11 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
可乐鸡翅yeah_12 小时前
第三方接口对接 M3U8 流媒体排坑实战,解决外部服务商流兼容难题
前端·javascript·python·django·html·m3u8·m3u8在线
默_笙12 小时前
🏠 「LLM Notes」:我用 Next.js + Redis 给自己造了个笔记博客
前端·javascript
ruanCat14 小时前
Prettier 明明执行成功,Markdown 为什么还是没变?一次插件误诊复盘
前端·javascript·node.js