要让修改拷贝对象时不影响原对象,关键在于切断引用关系。javascript中对象和数组是引用类型,直接赋值或浅拷贝只复制地址;需依结构复杂度选深拷贝策略:一、简单纯数据用json.parse(json.stringify());二、现代环境优先structuredclone;三、老环境或复杂结构用lodash.clonedeep;四、扁平结构可用浅拷贝如展开运算符。

要让修改拷贝对象时不影响原对象,关键在于**切断引用关系**。JavaScript 中对象和数组是引用类型,直接赋值(=)或浅拷贝只复制地址,改副本等于改原数据。必须根据数据结构复杂度选择合适的深拷贝策略。
一、简单纯数据对象:用 JSON 方法最轻量
适用于只含字符串、数字、布尔、null、普通对象和数组,不含函数、Date、RegExp、Symbol、undefined、Map、Set 等:
const safeCopy = JSON.parse(JSON.stringify(original))- 优点:无依赖、写法短、能处理多层嵌套
- 缺点:会丢弃函数、Symbol、undefined;Date 变成字符串;正则变为空对象
二、现代浏览器环境:优先用 structuredClone
ES2022 引入的原生 API,支持大多数内置类型,还能正确处理循环引用和 Transferable 对象:
const safeCopy = structuredClone(original)- 支持:Object、Array、Map、Set、Date、RegExp、ArrayBuffer、TypedArray、Error、BigInt 等
- 不支持:函数、DOM 节点、某些自定义类实例(如 Promise)
- 注意:目前在 Node.js 18.13+ 和主流浏览器中已稳定可用
三、需要兼容老环境或复杂结构:用 lodash.cloneDeep
当项目需支持 IE 或含大量特殊类型(如自定义类、稀疏数组、不可枚举属性)时,lodash 是成熟可靠的选择:
import { cloneDeep } from 'lodash-es'; const safeCopy = cloneDeep(original);- 优势:兼容性好、覆盖边界情况全、可配置定制行为
- 代价:增加约 7–10KB 的包体积(建议按需引入或使用轻量替代如 clone-deep)
四、仅需第一层隔离:浅拷贝够用就别深拷
如果原始数据是扁平结构(无嵌套对象/数组),用浅拷贝更高效且安全:
- 对象:
const copy = { ...original }或Object.assign({}, original) - 数组:
const copy = [...original]或original.slice() - 注意:一旦
original里有{ user: { name: 'A' } }这类嵌套,这些方式就不保险了
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











