ES6展开运算符(...)仅实现浅拷贝,对一维数组和纯对象有效,但嵌套结构仍共享引用;它不处理函数、Symbol、Date等特殊类型,非深拷贝方案。

ES6展开运算符(...)是实现浅拷贝最简洁的方式之一,但它只对第一层结构做“值复制”,嵌套的引用类型仍共享内存地址。用它处理一维数组或纯对象时非常高效;一旦出现多层嵌套,就得额外处理。
一维数组:展开运算符就是安全可靠的浅拷贝
对不含嵌套对象/数组的一维数组,[...arr] 等价于 arr.slice() 或 Array.from(arr),能完全隔离修改影响:
- 直接复制不共享引用:修改新数组元素,原数组不受影响
-
语法极简:
const copy = [...original]; -
支持链式操作,比如去重:
[...new Set(original)]
纯对象(无嵌套):展开可替代 Object.assign
当对象所有属性都是基本类型(字符串、数字、布尔等),{...obj} 就能安全拷贝:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
覆盖写法清晰:
const merged = { ...defaults, ...userInput }; -
避免污染原对象:新增或改属性不会影响
obj - 比 Object.assign 更直观,且天然支持解构与默认值组合
遇到嵌套结构时:展开运算符会失效
只要对象或数组里包含另一层对象、数组或函数,展开就只复制外层引用,内部仍共用同一块内存:
- 例如
const obj = { a: 1, b: { c: 2 } }; const copy = { ...obj };→copy.b === obj.b为true - 修改
copy.b.c = 3,obj.b.c同步变成 3 - 数组同理:
const arr = [1, { x: 10 }]; const copy = [...arr];→copy[1] === arr[1]
边界提醒:别误以为它是深拷贝工具
展开运算符不是万能复制方案,它不递归、不识别 Symbol、不处理函数、Date、RegExp 等特殊类型:
-
无法拷贝方法或原型链:
{...obj}只取自有可枚举属性 - 忽略 undefined 属性(但保留 null)
- JSON.stringify + parse 不是通用解法:会丢失函数、undefined、循环引用、BigInt、Date 等
- 真正需要深拷贝时,应选用
structuredClone(现代浏览器支持)、Lodash 的cloneDeep,或按需手写递归逻辑

















