JavaScript浅拷贝仅复制对象第一层属性,嵌套引用值共享;推荐用展开运算符{...obj}或Object.assign(),二者均不处理Symbol、不可枚举属性及原型方法。

JavaScript 中实现对象的浅拷贝,核心是复制对象的第一层属性,不深入嵌套对象或数组。原对象和拷贝对象共享内部引用值(如对象、数组),修改嵌套内容会影响彼此。
使用展开运算符(...)
最简洁常用的方式,适用于普通对象(不含 Symbol 属性、不可枚举属性或原型方法):
const obj = { a: 1, b: { c: 2 } };
const shallowCopy = { ...obj };
shallowCopy.a = 99; // ✅ 不影响原对象
shallowCopy.b.c = 99; // ❌ 会影响 obj.b.c,因为 b 是引用
使用 Object.assign()
兼容性更好(支持 IE11),语法稍长,效果与展开运算符一致:
const obj = { x: 10, y: [1, 2] };
const shallowCopy = Object.assign({}, obj);
// 或写成:Object.assign(Object.create(Object.getPrototypeOf(obj)), obj)
// 若需保留原型链,可选后者
注意边界情况
浅拷贝不会处理以下内容,需额外判断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 数组会被复制为新数组,但数组内对象仍为引用
- 函数、Date、RegExp、Map、Set 等特殊类型照常复制引用
- 不可枚举属性、Symbol 键、原型上的属性默认不被拷贝
- null、undefined、原始值(string/number/boolean)会正确复制(因它们是值类型)
不推荐的手动 for...in 循环
虽可行,但易漏掉原型链控制、不可枚举属性等问题,且代码冗长:
const shallowCopy = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
shallowCopy[key] = obj[key];
}
}
除非有特殊需求(如过滤 key),否则优先用展开运算符或 Object.assign()。

















