structuredclone()是目前最简单可靠的原生深拷贝方案,支持map、set、date等内置类型及循环引用,但不支持函数、undefined、symbol等非可序列化值,且旧浏览器兼容性有限。

直接用 structuredClone(),它是目前最简单、最可靠、原生支持 Map 和 Set 的深拷贝方案。
为什么 structuredClone 是首选
它专为现代 JavaScript 设计,能正确处理包括 Map、Set、Date、RegExp、ArrayBuffer、TypedArray 在内的多种内置类型,而且天然支持循环引用——这些是 JSON 方案或浅拷贝完全做不到的。
- Map 和 Set 的键、值都会被递归深拷贝,新旧对象之间无任何引用共享
- 嵌套结构(比如 Map 里存 Set,Set 里存对象,对象里又有 Map)也能完整保留
- 不需要引入第三方库,不写递归逻辑,一行代码搞定
structuredClone 的基本用法
直接传入原始对象,返回一个完全独立的克隆体:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
const original = {
name: "Alice",
map: new Map([["a", 1], ["b", { x: 2 }]]),
set: new Set([1, "two", { y: 3 }]),
nested: { arr: [new Set([4])] }
};
const cloned = structuredClone(original);
cloned.map.set("c", 3); // 不影响 original.map
console.log(original.map.size); // 2
console.log(cloned.set.has(1)); // true
console.log(cloned.nested.arr[0] === original.nested.arr[0]); // false(已深拷贝)
需要注意的限制
structuredClone 虽强,但不是万能的:
- 不支持函数(
function、箭头函数)、undefined、Symbol键、Promise、Error等非可序列化值 - 不拷贝对象原型链和不可枚举属性
- 旧环境不支持:IE 全系、Chrome
兼容旧环境或需自定义时怎么办
如果必须支持老浏览器,或需要跳过某些字段、转换 Symbol、保留函数等,就得手写递归深拷贝函数。核心要点包括:
- 用
WeakMap缓存已克隆对象,解决循环引用 - 分别判断
Map、Set、Date、RegExp等类型,调用对应构造器和方法重建 - 对 Map 使用
new Map([...original.entries()].map(([k, v]) => [deepClone(k), deepClone(v)])) - 对 Set 使用
new Set([...original].map(item => deepClone(item)))










