javascript拷贝对象的核心逻辑是处理引用地址与值的复制边界,仅对引用类型存在深浅之分;基本类型天然值拷贝,独立互不影响;浅拷贝只切断第一层引用,深层引用仍共享;深拷贝则递归创建全新内存空间,彻底隔离对象。

JavaScript拷贝对象的核心逻辑,本质是处理「引用地址」和「值」的复制边界问题——只对引用类型才有“深浅”之分,基本类型天然就是值拷贝。
拷贝的前提:区分基本类型与引用类型
基本类型(String、Number、Boolean、null、undefined、Symbol、BigInt)存在栈中,赋值即复制值,彼此完全独立;引用类型(Object、Array、Date、RegExp、Function 等)在堆中存数据,栈中只存指向堆的地址,赋值或默认拷贝只是复制这个地址,导致新旧变量共享同一份数据。
浅拷贝:只切断第一层引用
创建新对象,把原对象第一层属性逐个复制过去:
- 基本类型属性 → 复制值,互不影响
- 引用类型属性 → 复制地址,新旧对象仍共用深层数据
典型方法包括:展开运算符 {...obj}、Object.assign({}, obj)、数组的 slice() 或 concat()。它们都不处理原型链、不可枚举属性,也不递归拷贝嵌套对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
深拷贝:递归切断所有层级引用
目标是在堆内存中开辟全新空间,让新对象与原对象彻底隔离。关键难点在于:
- 递归遍历所有嵌套层级
- 正确识别并处理特殊对象(Date、RegExp、Map、Set、ArrayBuffer 等)
- 避免循环引用导致栈溢出(需 WeakMap 缓存已处理对象)
现代推荐首选 structuredClone()(原生支持,处理全面);JSON 方法(JSON.parse(JSON.stringify(obj)))简单但会丢失函数、undefined、Symbol、Date、RegExp 等,且不支持循环引用。
判断是否需要深拷贝的关键信号
当修改副本后,发现原始对象也被意外改变,就说明当前用的是浅拷贝或直接赋值。常见于以下场景:
- 表单数据初始化后多次编辑提交
- 状态管理中对嵌套 state 做局部更新
- 配置对象被多个模块复用并各自修改
此时必须确认拷贝深度,并选用合适方式切断引用链。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










