structuredClone 是 JavaScript 原生深拷贝方法,支持循环引用及多种类型,但不支持函数、Promise 等;用法为 const cloned = structuredClone(original),需注意环境兼容性与类型限制。

JavaScript 中使用 structuredClone 实现原生深拷贝非常简单,它由浏览器和 Node.js(v17.0+)原生提供,无需第三方库,能安全、高效地克隆支持的类型,且自动处理循环引用。
基本用法:一行代码完成深拷贝
直接传入要克隆的对象或值即可,返回一个结构上完全独立的副本:
const cloned = structuredClone(original);例如:
const obj = { a: 1, b: [2, 3], c: { d: 4 } };const copy = structuredClone(obj);
copy.b.push(5);
console.log(obj.b); // [2, 3] —— 原对象未受影响
支持的数据类型与限制
structuredClone 基于 structured clone algorithm,支持大多数常用类型,但不是“万能”的:
立即学习“Java免费学习笔记(深入)”;
- ✅ 支持:普通对象、数组、Map、Set、Date、RegExp、ArrayBuffer、TypedArray、DataView、Blob、File、ImageBitmap、DOM 节点(部分环境)、null、undefined、布尔/数字/字符串/BigInt/Symbol(仅限可序列化的 Symbol,如 Symbol.for() 创建的)
- ❌ 不支持:函数、Promise、Error 对象、WeakMap、WeakSet、代理(Proxy)、不可枚举属性、属性访问器(getter/setter)、RegExp 的 lastIndex(会被重置)
- ⚠️ 注意:Symbol 键在对象中会被忽略(整个键值对不被克隆);循环引用可正常处理,不会报错
常见使用场景与注意事项
适合用于状态管理、配置备份、跨 Worker 传递数据等需要可靠深拷贝的场合:
- 在
postMessage中向 Web Worker 传参时,可先用structuredClone确保主进程数据不被意外修改 - React/Vue 等框架中避免直接修改 props 或响应式数据时,可用它快速生成不可变副本
- 若遇到不支持的类型(如函数),会抛出
DataCloneError,建议包裹 try-catch 并降级处理 - Node.js 中需确保版本 ≥ 17.0,且启用
--enable-structured-clone标志(v17.0–v18.6 需手动开启;v18.7+ 默认启用)
对比 JSON.parse(JSON.stringify())
相比传统方案,structuredClone 更健壮:
- 保留 Date、RegExp、undefined、NaN、Infinity、BigInt 等类型(JSON 会丢失或转成 null/字符串)
- 正确处理循环引用(JSON 方案直接报错)
- 不忽略 undefined 和函数以外的不可枚举属性(实际仍忽略不可枚举属性,但比 JSON 多支持类型)
- 性能通常更好,尤其对大型嵌套结构
但它不能替代自定义克隆逻辑(如需特殊字段过滤、转换或处理不支持类型)。


















