javascript复制引用类型需深拷贝避免副作用:浅拷贝用展开运算符仅限一层;json方法简洁但丢失函数、symbol等;structuredclone支持多数内置类型且处理循环引用;复杂场景推荐lodash的clonedeep。

JavaScript 中复制引用类型(如对象、数组)时,直接赋值只会复制引用,导致修改副本时原数据也被改变。要避免副作用,需进行深拷贝或根据场景选择合适的浅拷贝方式。
用结构赋值或展开运算符做浅拷贝(适用于一层结构)
对数组或对象的第一层属性有效,但嵌套对象仍共享引用。
- 数组:const newArr = [...oldArr]
- 对象:const newObj = { ...oldObj }
- 注意:如果 oldObj 中有嵌套对象(如 oldObj.user.name),newObj.user 仍指向同一内存地址
用 JSON 方法快速深拷贝(简单场景可用)
适合纯数据对象(不含函数、undefined、Symbol、Date、RegExp、Map、Set 等):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- const deepCopy = JSON.parse(JSON.stringify(original))
- 优点:简洁、无依赖
- 缺点:会丢失函数、过滤 undefined 和 Symbol;Date 变成字符串;循环引用直接报错
用 structuredClone(现代浏览器推荐)
ES2022 新增,支持大多数内置类型(Date、RegExp、Map、Set、ArrayBuffer 等),且能处理循环引用:
- const copy = structuredClone(original)
- 目前主流浏览器已支持(Chrome 98+、Firefox 94+、Edge 98+),Node.js 17.0+ 启用 --harmony-structured-clone
- 不支持函数、Error 对象、DOM 节点等非可序列化值
用第三方库应对复杂需求(如 lodash)
需要兼容老环境或处理特殊类型时:
- lodash 的 _.cloneDeep() 支持函数、正则、日期、Map/Set、循环引用等
- 安装:npm install lodash,使用:import { cloneDeep } from 'lodash'
- 注意:引入整包会增大体积,可考虑按需导入或使用轻量替代(如 clone-deep)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










