数组变量深度克隆实战:规避浅拷贝带来的引用修改隐患

冬瑶大大_7324

冬瑶大大_7324

2026-05-08

617人浏览

原创

数组变量深度克隆的核心目标是生成内容完全一致且所有嵌套值均为全新内存地址的独立副本;浅拷贝仅复制最外层数组,内部引用类型仍共享地址,导致修改联动;structuredclone()是现代首选方案,支持多种类型并处理循环引用,但不支持函数、undefined等;兼容旧环境推荐lodash的_.clonedeep();浅拷贝适用于元素全为基本类型或确认不修改嵌套对象的场景。

数组变量深度克隆实战:规避浅拷贝带来的引用修改隐患

数组变量深度克隆的核心目标,是生成一个**内容完全一致、所有嵌套值均为全新内存地址**的独立副本。只要存在任何一层引用共享,修改副本就可能意外污染原始数据——这是前端开发中高频踩坑点。

为什么浅拷贝会“联动”修改?

JavaScript 中数组是引用类型。浅拷贝(如 [...arr]、arr.slice()、Array.from(arr))只新建最外层数组实例,内部若含对象、日期、正则、嵌套数组等,仍指向原内存地址:

  • arr = [1, {x: 2}] → copy = [...arr]
  • copy[1].x = 99 → arr[1].x 同步变为 99

现代标准方案:structuredClone() 是首选

ECMAScript 原生 API,支持 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、嵌套对象/数组,保留类型与行为,且自动处理循环引用:

  • ✅ 浏览器:Chrome 98+、Firefox 94+、Safari 15.4+
  • ✅ Node.js:18.16+ / 20.6+ 稳定支持(无需 flag)
  • ❌ 不支持函数、undefined、Symbol、WeakMap/WeakSet(与规范一致)

用法极简:const deepCopy = structuredClone(originalArray);

兼容旧环境的可靠替代方案

当需支持 IE 或老旧 Node 版本时,避免使用 JSON.parse(JSON.stringify())(丢失 Date/RegExp/函数/undefined/循环引用):

  • 推荐 Lodash 的 _.cloneDeep():成熟、健壮、覆盖边界情况
  • 手写递归深拷贝需额外处理:Date、RegExp、Map/Set、循环引用(WeakMap 缓存已克隆对象)
  • MessageChannel 可用于跨上下文深拷贝(如主线程 ↔ Web Worker),但属异步,不适用于同步逻辑

什么情况下浅拷贝就够用?

并非所有场景都需要深拷贝。以下情形用展开运算符或 slice() 完全安全:

  • 数组元素全是基本类型(number/string/boolean/null)
  • 仅需隔离一维结构,且确认后续不会修改嵌套对象
  • 性能敏感场景(如每帧处理大量简单数组),深拷贝开销明显更高
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10897

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8002

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6952

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1164

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1416

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2869

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20151

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1255

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习