structuredclone 是原生深拷贝 api,支持 chrome 98+、firefox 94+、safari 15.4+、node.js 17.0+(需标志);可拷贝 date、regexp、map、set、arraybuffer 等及循环引用,但不支持 function、promise、dom 节点、symbol 键和原型链。

structuredClone 是什么,哪些浏览器能用
structuredClone 是原生支持深拷贝的 API,能安全复制包含 Date、RegExp、Map、Set、ArrayBuffer、TypedArray 甚至循环引用的对象,比 JSON.parse(JSON.stringify(obj)) 可靠得多。
但它不是全平台可用:Chrome 98+、Firefox 94+、Safari 15.4+ 支持;Node.js 17.0+(需启用 --harmony-structured-clone 标志,18.13+ 默认开启);IE 完全不支持,旧版 Edge(EdgeHTML)也不行。
如果目标环境不确定,得先检测:
if (typeof structuredClone !== 'function') {
throw new Error('structuredClone not supported');
}
哪些值能被 structuredClone 正确拷贝
它基于 HTML 结构化克隆算法,只允许可序列化的值。以下可以正常拷贝:
-
Object、Array(含嵌套) -
Date、RegExp -
Map、Set、WeakMap、WeakSet(注意:WeakMap/WeakSet在拷贝时会被忽略,不报错但内容丢失) -
ArrayBuffer、TypedArray、DataView -
BigInt、Boolean、String、Number、null、undefined(⚠️undefined拷贝后仍是undefined,但若在对象属性中,该属性会被丢弃) - 带循环引用的对象(自动处理,不会爆栈)
以下会直接抛错:
-
Function(包括箭头函数、class 方法) Promise-
Error实例(new Error()) -
Window、Document、Element等 DOM 节点 -
Symbol键名(整个键值对被跳过)
常见错误:TypeError: Cannot serialize a function
这是最常遇到的报错,比如你试图拷贝一个带方法的对象:
const obj = { x: 1, fn: () => {} };
structuredClone(obj); // ❌ Uncaught TypeError: Cannot serialize a function
解决思路不是“绕过”,而是「提前清理」——深拷贝前手动剥离不可序列化字段:
- 用
Object.getOwnPropertyNames()+typeof过滤掉'function'属性 - 或用
JSON.stringify预检(虽不能替代structuredClone,但可快速发现函数/undefined/Symbol) - 更稳妥的做法:只对明确需要深拷贝的数据子树调用
structuredClone,而非整个组件实例或上下文对象
别指望 structuredClone 处理业务逻辑层的“方法保留”需求;它定位是数据传输(如 postMessage),不是运行时对象重建。
和 JSON.parse(JSON.stringify()) 对比的实际影响
用 JSON 方式深拷贝看似简单,但隐性损失严重:
-
Date变成字符串,RegExp变成空对象{} -
undefined、function、Symbol键全部消失 -
NaN、Infinity变成null - 循环引用直接
RangeError: Maximum call stack size exceeded
而 structuredClone 在支持环境下,几乎零配置就能保住类型和结构。唯一要注意的是:它**不拷贝原型链**——返回的是纯数据对象,obj.constructor === Object,原类实例方法、访问器(get/set)全部丢失。如果你依赖 instanceof 或自定义原型方法,就得自己重建实例。
真正容易被忽略的点是:它不处理 Proxy 和 custom inspectors(比如 Node.js 的 [util.inspect.custom]),这些对象会退化为普通空对象或抛错。别把它当成万能对象镜像工具,它只管“安全可传的数据”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











