珊珊老师 的笔记

做最负责任的教育~我是执行者珊珊

2025-06-25 16:01

JavaScript新特性structuredClone(),一行代码优化深拷贝策略

珊珊老师

Java后端

(34)

(0)

收藏

一、structuredClone()介绍

1、structuredClone()是什么

        structuredClone() 是浏览器和 Node.js 的原生 API,底层使用更高效的 C++ 实现,比起 JS 层的 JSON.stringify/parse 组合,性能通常更好。

        在结构复杂/嵌套多时差异更明显,不需要转成字符串再解析,避免了冗余的编码/解码过程。

2、structuredClone()环境支持

        在 Node.js 17+、Chrome 98+、Firefox 94+ 中支持。

3、structuredClone()不会拷贝的内容

image.png

4、基础案例

        structuredClone()支持Map、Set、Blob、Date、File等JSON.parse(JSON.stringify(obj))不支持的类型:

const original = {
// 原始类型
string: 'Hello',
number: 123,
boolean: true,
null: null,
undefined: undefined, // JSON会丢失,structuredClone保留
 
// 日期对象 (JSON会转为字符串,structuredClone保持为Date对象)
date: newDate('2023-06-15'),
 
// 正则表达式 (JSON会转为空对象,structuredClone保持为RegExp对象)
regex: /pattern/g,
 
// 集合类型
map: newMap([['key', 'value']]),
set: newSet([1, 2, 3]),
 
// 二进制数据
arrayBuffer: newUint8Array([1, 2, 3]).buffer,
typedArray: newUint8Array([1, 2, 3]),
 
// 嵌套数组和对象
array: [1, 2, { nested: true }],
object: { nested: { deep: true } }
};
 
const clone = structuredClone(original);
 
// 验证类型保持一致
console.log(clone.date instanceof Date);        // true
console.log(clone.regex instanceof RegExp);     // true
console.log(clone.map instanceof Map);          // true
console.log(clone.set instanceof Set);          // true
console.log(clone.arrayBuffer instanceof ArrayBuffer); // true
console.log(clone.typedArray instanceof Uint8Array);  // true
 
const clone2 = JSON.parse(JSON.stringify(original));
console.log(clone2.date instanceof Date); // false (变成字符串)
console.log(clone2.set instanceof Set); // false (变成数组)

二、 structuredClone()比JSON.parse(JSON.stringify(obj))有什么区别

1、对比表格

image.png

2、循环引用

        循环引用是对象内部相互引用,形成“闭环”的结构,比如:

const obj = {};
obj.self = obj;
const cloned = structuredClone(obj);

 如果用 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条评论

点击登录参与评论