structuredclone()是浏览器原生深拷贝方法,支持对象、数组、map、set、date、regexp、arraybuffer等,不支持函数、class实例、dom节点、promise等,使用需try/catch并检查兼容性。

直接调用 structuredClone() 就行,它是浏览器原生支持的深拷贝方法,专为安全、高效复制复杂前端数据结构而设计。
哪些数据能被正确克隆
它基于 HTML 标准的结构化克隆算法,能完整保留类型和结构,包括:
- 普通对象、数组(支持任意嵌套和循环引用)
- Map、Set(键值对和元素都深拷贝)
- Date、RegExp(生成全新实例,不共享引用)
- ArrayBuffer、TypedArray(如 Uint8Array)、DataView
- BigInt、Boolean、String、Number、null、undefined(注意:作为对象属性值时,部分旧版浏览器可能忽略)
- Blob、File、ImageData、MessagePort(浏览器环境)
哪些不能克隆,要特别小心
遇到以下类型会抛错或静默跳过,不能依赖它“自动处理”:
- 函数(含对象里的方法)——克隆后只剩数据,方法丢失
- class 实例(如 new User())——变成普通对象,constructor 和原型链消失
- DOM 节点(document、element)、window、document
- Error、Promise、WeakMap、WeakSet、Proxy
- Symbol 键名的对象属性——整个键值对被忽略
实际使用建议
别裸奔调用,加一层保护更稳妥:
- 始终用 try/catch 包裹,捕获不支持或不可克隆导致的异常
- 兼容性检查:运行前判断
typeof structuredClone === 'function' - 含不可克隆字段时,先剥离(比如过滤掉 method、instance 等),再克隆核心数据
- 需要零拷贝大内存(如视频帧 ArrayBuffer)时,用
{ transfer: [buffer] }参数移交所有权
简单示例
一行代码完成典型场景:
const original = {
name: 'Alice',
scores: [95, 87],
meta: { created: new Date(), pattern: /test/g },
tags: new Set(['js', 'web'])
};
const clone = structuredClone(original);
clone.scores.push(100);
console.log(original.scores.length); // 2 —— 原始数据未变
console.log(clone.meta.created instanceof Date); // true —— 类型保留
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











