浅拷贝解构赋值或扩展运算符仅复制对象第一层可枚举属性,嵌套对象仍共享引用;扩展运算符语法简洁:const newobj = { ...oldobj },但不处理原型、symbol属性及null/undefined。

使用浅拷贝解构赋值或扩展运算符复制对象的第一层属性,本质是创建一个新对象,其自身可枚举属性(不包括原型链上的)被原样复制。这种方式只复制第一层,嵌套对象仍共享引用。
用扩展运算符(...)快速浅拷贝
最简洁常用的方式,适合大多数单层结构:
- 语法:const newObj = { ...oldObj };
- 仅复制对象自身的可枚举属性,忽略不可枚举属性(如 constructor、toString)和 symbol 属性(除非显式展开)
- 对 null 或 undefined 会报错,使用前建议检查;可配合空对象兜底:const newObj = { ...oldObj ?? {} };
- 示例:
const user = { name: 'Alice', profile: { age: 30 } };
const copy = { ...user };
copy.name = 'Bob'; // ✅ 独立修改
copy.profile.age = 31; // ❌ 原 user.profile.age 也会变
用解构赋值 + 对象字面量组合复制指定属性
当只需复制部分第一层字段,或需重命名、设置默认值时更灵活:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 语法:const { a, b, c = 'default' } = oldObj; const copy = { a, b, c };
- 天然跳过未解构的属性,也跳过嵌套深层内容(仍是浅层)
- 支持默认值、别名:const { name: fullName, id } = user; const copy = { fullName, id };
- 注意:解构本身不创建新对象,必须显式用 {} 包裹生成目标对象
注意事项与常见误区
浅拷贝不是万能的,关键要清楚它的边界:
- 不处理嵌套对象/数组:内部引用不变,修改子属性会影响原对象
- 不拷贝原型和方法:{ ...obj } 得到的是 plain object,丢失原型链和 class 实例特性
- 不能替代深拷贝需求:如需完全隔离,应改用 structuredClone()、JSON.parse(JSON.stringify())(有局限)或专用库
- Symbol 属性不会被自动展开:需手动添加:{ ...obj, [Symbol.key]: obj[Symbol.key] }
只要目标只是“断开第一层键值绑定”,扩展运算符和解构赋值就是轻量、可读、高效的首选方案。










