JavaScript新特性structuredClone(),一行代码优化深拷贝策略
作者:watermelo37
CSDN万粉博主、华为云云享专家、阿里云专家博主、腾讯云、支付宝合作作者,全平台博客昵称watermelo37。
一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。
---------------------------------------------------------------------
温柔地对待温柔的人,包容的三观就是最大的温柔。
---------------------------------------------------------------------
JavaScript新特性structuredClone(),一行代码优化深拷贝策略
structuredClone()使用起来非常简单:
const cloned = structuredClone(obj);
替代:
const cloned = JSON.parse(JSON.stringify(obj));
想知道structuredClone()除了深拷贝以外,还有哪些JSON.parse(JSON.stringify(obj))所没有的功能吗?比起JSON.parse(JSON.stringify(obj))有什么性能上的提升吗?structuredClone()的环境限制有哪些?
本文会告诉你答案。
一、structuredClone()介绍
1、structuredClone()是什么
structuredClone() 是浏览器和 Node.js 的原生 API,底层使用更高效的 C++ 实现,比起 JS 层的 JSON.stringify/parse 组合,性能通常更好。
在结构复杂/嵌套多时差异更明显,不需要转成字符串再解析,避免了冗余的编码/解码过程。
2、structuredClone()环境支持
在 Node.js 17+、Chrome 98+、Firefox 94+ 中支持。
3、structuredClone()不会拷贝的内容
不支持或无法克隆的类型/结构 | 说明 |
---|---|
函数 (Function ) |
无法克隆函数或方法 |
Symbol | Symbol 属性会被忽略 |
类实例的方法/原型链 | 原型链不会保留,克隆后不是原类的实例 |
DOM 节点(如 Element、Node) | 不支持 DOM 对象(比如浏览器中的 HTML 元素) |
Proxy 对象 | 无法克隆代理对象(Proxy ) |
WeakMap / WeakSet | 因其不可枚举和弱引用特性,无法被克隆 |
函数作用域内的闭包变量 | 本质上函数不能克隆,因此也无法保留闭包 |
不可序列化的 host 对象 | 如浏览器特有的某些对象(如 Window , FileList ) |
4、基础案例
structuredClone()支持Map、Set、Blob、Date、File等JSON.parse(JSON.stringify(obj))不支持的类型:
5、structuredClone()的兼容性判断
可以用如下代码安全使用 structuredClone(),在不支持的环境里自动回退到 JSON 方案(虽然功能会弱一些):
二、 structuredClone()比JSON.parse(JSON.stringify(obj))有什么区别
1、对比表格
特性 | JSON.parse(JSON.stringify(obj)) | structuredClone(obj) |
---|---|---|
深拷贝 | 是 | 是 |
性能 | 较慢(中间需要序列化+解析) | 更快(原生实现) |
支持循环引用 | 报错 | 支持 |
支持类型丰富度 | 仅支持普通对象、数组、字符串、数字、布尔、null | 支持更多类型(Map、Set、Blob、Date、File 等) |
丢失信息 | 会丢失函数、undefined、Symbol、日期、原型链等 | 保留更多原始结构 |
错误处理 | 易错(如循环引用会直接抛错) | 更安全,报错更明确 |
2、循环引用
循环引用是对象内部相互引用,形成“闭环”的结构,比如:
如果用 JSON.stringify(obj) 就会报错:TypeError: Converting circular structure to JSON。但 structuredClone() 就能正确处理
三、structuredClone()在性能上的提升
根据多个社区实测 benchmark(如 JSBench.me、V8 团队 blog 和真实项目测试):
- 深层嵌套对象(10层以上):structuredClone() 明显更快;
- 包含 Map、Set、Date、ArrayBuffer 的复杂对象:structuredClone() 能直接处理,而 JSON 克隆则需要额外转换或报错;
- 平均测试中 structuredClone() 比 JSON 快 1.5~5 倍,尤其在大型对象上提升更显著。
四、结语
目前,structuredClone() 已被所有主流浏览器支持。它为深拷贝问题提供了一个简单、高效的解决方案,快来拥抱这个JavaScript新特性吧。
只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
- 点赞
- 收藏
- 关注作者
评论(0)