structuredClone 是现代 JavaScript 最推荐的原生深拷贝方案,支持对象、数组、Map、Set、Date、RegExp、ArrayBuffer 等类型,自动处理嵌套结构,但不支持函数、undefined、WeakMap/WeakSet、DOM 节点及循环引用。

JavaScript 中用 structuredClone 实现深拷贝非常简单,它原生支持、无需第三方库,且能正确处理大多数常见类型(如对象、数组、Map、Set、Date、RegExp、ArrayBuffer 等),还能跨线程安全复制(比如在 Worker 中)。
structuredClone 的基本用法
直接传入要拷贝的值即可,返回一个全新的、与原值结构相同但内存独立的副本:
const original = {
name: "Alice",
hobbies: ["reading", "coding"],
meta: new Date(),
flags: new Set([1, 2, 3])
};
const cloned = structuredClone(original);
console.log(cloned.name === original.name); // true(值相等)
console.log(cloned.hobbies === original.hobbies); // false(引用不同)
console.log(cloned.meta instanceof Date); // true
console.log(cloned.flags instanceof Set); // true
它能处理哪些数据类型?
structuredClone 基于“结构化克隆算法”,支持以下类型(不支持的会抛错):
- 普通对象、数组、Map、Set
- Date、RegExp、BigInt、Boolean、Number、String、Symbol(仅作为属性键时会被忽略)
- ArrayBuffer、TypedArray(如 Uint8Array)、DataView
- ImageBitmap、ImageDate(部分环境)、FormData(有限支持)
- 嵌套结构(自动递归处理)
⚠️ 不支持:function、undefined、WeakMap、WeakSet、window 或 document 对象、带有循环引用的对象(会报 DataCloneError)。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
使用注意事项和常见问题
虽然方便,但要注意几个关键点:
-
浏览器兼容性:Chrome 98+、Firefox 94+、Safari 15.4+ 支持;旧版需降级方案(如
JSON.parse(JSON.stringify()),但有类型丢失风险) -
循环引用会报错:如果对象内部存在自引用或互相引用,
structuredClone会立即抛出DOMException: DataCloneError -
不可枚举属性和原型链不会被复制:只克隆可枚举的自身属性,不复制
__proto__、getter/setter、方法等 - Symbol 属性会被忽略:即使作为对象键存在,也不会出现在克隆结果中
替代方案对比(何时不用 structuredClone)
如果你需要支持更老环境,或必须处理函数、undefined、循环引用等,可以考虑:
-
JSON.parse(JSON.stringify(obj)):轻量但丢失函数、Date 变字符串、NaN/Infinity 变 null、无法处理 undefined 和循环引用 - Lodash 的
_.cloneDeep():功能全面,支持函数、循环引用、自定义克隆逻辑,但引入额外依赖 - 手写递归 + WeakMap 缓存:适合学习或极简场景,但易出错、难覆盖所有边界
日常开发中,只要目标环境满足,structuredClone 是最推荐的深拷贝方式——简洁、安全、标准。

















