JavaScript 对象拷贝

javascript_object_copy2026-10-29 11:03:47

JavaScript 对象拷贝涉及创建新容器及决定嵌套值如何共享。赋值、浅拷贝、深拷贝有不同的身份与数据保留语义。

引用与浅拷贝

const b = a 让两个变量持有同一个对象。对象展开与 Object.assign 通常只复制一层自有可枚举属性,嵌套对象仍然共享:

const source = { profile: { name: "Lin" } };
const copy = { ...source };
copy.profile.name = "Chen";
console.log(source.profile.name); // Chen

因此“创建了新对象”并不意味着所有内部数据都独立。更新某条嵌套路径时,可以只复制该路径上的容器,让未修改分支继续共享。

structuredClone

浏览器中的 structuredClone 使用结构化克隆算法,支持循环引用和多种内置数据类型。但函数与 DOM 节点等不能被克隆,也不能把它视为完整保留自定义类原型、访问器和属性描述符的通用复制方案。使用前应检查运行环境与实际数据类型。

参考:structuredClone 官方参考。

JSON 序列化的边界

JSON.parse(JSON.stringify(value)) 只适合接受 JSON 数据语义的场景:对象属性中的 undefined、函数、Symbol 可能被丢弃,数组中的这些值可能变为 null;Date 通常变为字符串,Map 与 Set 不会按其条目自动保留,循环引用会抛错,BigInt 默认也会抛错。

这是一轮序列化与解析,不是任意 JavaScript 对象的无损深拷贝。需要手写深拷贝时,先明确是否支持循环、共享引用、原型、属性描述符与特殊内置对象,再确定实现范围。

参考:JSON.stringify 官方参考。

本页目录