JavaScript中对象浅拷贝只复制第一层属性:基本类型获新值,引用类型共享内存;常用Object.assign()和扩展运算符实现,速度快但嵌套修改会影响原对象。

JavaScript 中对象浅拷贝,就是只复制第一层属性值:基本类型(如字符串、数字)会得到新值,引用类型(如嵌套对象、数组)仍共享同一内存地址。它不递归处理深层结构,速度快、开销小,适合简单扁平对象或明确不需要隔离嵌套修改的场景。
用 Object.assign() 创建浅拷贝
这是最经典、兼容性最好的方式,适用于所有 ES5+ 环境。
- 语法:
const copy = Object.assign({}, originalObj)—— 第一个参数是空对象,避免污染原对象 - 支持多个源对象合并,后者的同名属性会覆盖前者:
Object.assign({}, a, b, c) - 只复制可枚举的自有属性,不处理不可枚举属性、Symbol 属性或原型链上的属性
用扩展运算符(...)更简洁
现代写法,语义清晰,推荐在支持 ES2015+ 的项目中使用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对象:
const copy = { ...originalObj } - 数组:
const newArr = [...oldArr] - 同样只作用于第一层;若原对象含嵌套对象,
copy.nested和originalObj.nested仍指向同一对象
注意浅拷贝的典型陷阱
一旦修改嵌套结构,原对象也会被影响——这不是 bug,而是浅拷贝的设计本质。
立即学习“Java免费学习笔记(深入)”;
- 例如:
const a = { x: 1, user: { name: 'Alice' } }; const b = { ...a }; b.user.name = 'Bob';→ 此时a.user.name也变成'Bob' - 常见误用:把浅拷贝当深拷贝用,尤其在 React state 更新、表单数据隔离等场景,容易引发隐蔽副作用
- 判断是否需要浅拷贝:只需隔离顶层字段(如替换
name、id),且确认不会改内部对象,就足够了
其他可用但较少用的方法
特定场景下可选,但通用性或可读性不如前两者。
-
JSON.parse(JSON.stringify(obj))不是浅拷贝,它是深拷贝(且有局限),别混淆 -
Object.create(originalObj)创建的是以原对象为原型的新对象,不是拷贝属性,慎用 - 手动遍历赋值(
for...in或Object.keys().forEach)适合需过滤属性或兼容极老环境,但易漏掉不可枚举属性

















