展开运算符(...)在JavaScript中实现对象浅拷贝,仅复制第一层属性,嵌套对象仍共享引用;修改顶层属性互不影响,但修改嵌套对象属性会同步原对象。

展开运算符(...)在 JavaScript 中用于对象浅拷贝时,只复制第一层属性,嵌套对象仍共享引用。修改拷贝后对象的顶层属性不会影响原对象,但修改嵌套对象的属性会同步反映到原对象。
顶层属性修改互不影响
使用展开运算符创建的对象副本,其自身可枚举属性会被独立复制。对副本的字符串、数字、布尔值等基本类型属性赋新值,原对象保持不变。
-
示例:
const obj = { a: 1, b: 'hello' };<br> const copy = { ...obj };<br> copy.a = 99;<br> console.log(obj.a); // 输出 1(未变)
嵌套对象仍为同一引用
如果原对象某个属性是对象(包括数组、日期、正则等),展开运算符只复制该属性的引用地址,而非递归拷贝内容。因此修改嵌套对象内部属性,原对象和副本都会看到变化。
-
示例:
const obj = { a: 1, info: { name: 'Alice' } };<br> const copy = { ...obj };<br> copy.info.name = 'Bob';<br> console.log(obj.info.name); // 输出 'Bob'
数组也遵循相同规则
对数组使用展开运算符(如 [...arr])同样属于浅拷贝。数组元素为基本类型时互不影响;若含对象,则对象引用被复用。
立即学习“Java免费学习笔记(深入)”;
-
示例:
const arr = [{ id: 1 }, 2];<br> const copy = [...arr];<br> copy[0].id = 99;<br> console.log(arr[0].id); // 输出 99
需要深拷贝怎么办
若需完全隔离嵌套结构,不能依赖展开运算符。可选用:
— JSON.parse(JSON.stringify(obj))(仅适用于纯数据,不支持函数、undefined、Date 等)
— 结构化克隆(structuredClone(obj),现代浏览器支持)
— 第三方库如 lodash 的 cloneDeep
-
推荐优先尝试:
const deepCopy = structuredClone(obj);


















