在 JavaScript 中,实现深拷贝(deep copy)常常令人头疼,传统方法要么性能差,要么功能有限(如 JSON.parse(JSON.stringify())
无法处理函数、日期、循环引用等)。不过,从 Node.js v17+ 和现代浏览器开始,JavaScript 引入了一个新特性 —— structuredClone()
,它用一行代码优雅解决了这个问题。
✅ 一行代码完成深拷贝
const clone = structuredClone(original);
🧠 structuredClone() 是什么?
structuredClone()
是一个全局函数,基于 HTML 标准中的 Structured Clone Algorithm 实现,可以递归深度拷贝任意复杂结构的数据对象,包括但不限于:
- 原始值(string, number, boolean, null, undefined, bigint)
- 对象、数组
- Map、Set
- Date、RegExp
- TypedArray、ArrayBuffer
- 循环引用 ✅
- Symbol ✅(注意:仅描述结构,不保留共享)
- DOM 对象 ❌(不可克隆)
🚫 它比 JSON 拷贝强在哪里?
特性 | JSON.parse(JSON.stringify()) | structuredClone() |
---|---|---|
函数(Function) | ❌ 省略 | ❌ 报错 |
日期(Date) | ⛔ 转换为字符串 | ✅ 保留 Date 类型 |
循环引用 | ❌ 报错 | ✅ 支持 |
正则表达式(RegExp) | ⛔ 转为 {} | ✅ 保留 RegExp 类型 |
Map / Set | ❌ 不支持 | ✅ 完整支持 |
undefined | ❌ 丢失 | ✅ 保留 |
✨ 示例
const original = {
name: "ChatGPT",
created: new Date(),
info: new Map([["version", 4.0]]),
tags: new Set(["AI", "OpenAI"]),
circular: null
};
original.circular = original; // 引入循环引用
const copy = structuredClone(original);
console.log(copy);
console.log(copy.created instanceof Date); // true
console.log(copy.info instanceof Map); // true
💡 使用建议
- ✅ 推荐优先使用
structuredClone()
代替手写的深拷贝逻辑 - ❗ 注意克隆的对象不能包含函数、DOM 节点等非可结构化数据,会抛错
- ✅ 可用于 Web Worker、postMessage、缓存、状态快照等场景
📦 兼容性注意
- ✅ Chrome 98+、Edge 98+、Firefox 94+、Safari 15.4+
- ✅ Node.js 17.0+(需开启
--experimental
)、Node.js 18+ 默认支持 - ⛔ 如果需要兼容旧环境,可使用 structuredClone polyfill
🔚 总结
一句话:想要快速、安全、高效地进行深拷贝,structuredClone()
就是你最好的朋友!
发表回复