推荐优先使用 structuredclone()——它是现代 javascript 原生支持的安全深克隆方案,能正确处理嵌套对象、数组、date、regexp、map、set、typedarray 等,并自动规避循环引用问题;支持原型链继承(clone instanceof original.constructor 多数仍为 true),但不支持函数、undefined、symbol、error 实例和 dom 节点。

推荐优先使用 structuredClone() —— 它是现代 JavaScript 原生支持的安全深克隆方案,能正确处理嵌套对象、数组、Date、RegExp、Map、Set、TypedArray 等,并自动规避循环引用问题。
何时用 structuredClone()?
适用于大多数标准数据结构,且运行环境支持(Chrome 98+、Firefox 94+、Safari 15.4+、Node.js 18.16+/20.6+):
- ✅ 支持原型链继承(克隆后
clone instanceof original.constructor多数仍为true) - ✅ 自动检测并安全处理循环引用
- ✅ 克隆 Map/Set 内容、正则标志、日期毫秒值等细节完整保留
- ❌ 不支持函数、
undefined、Symbol、Error实例、DOM 节点 —— 遇到即抛DataCloneError
需要兼容旧环境或处理特殊值怎么办?
当对象含函数、Symbol 属性、自定义类方法,或需在不支持 structuredClone 的环境中运行时,应手动实现:
- 用
Object.getPrototypeOf(obj)获取原原型,再用Object.create(proto)创建继承相同原型的新空对象 - 用
WeakMap缓存已处理对象,递归前先查表,彻底阻断循环引用 - 对特殊内置类型分别构造:如
new Date(obj)、new RegExp(obj)、new Map(obj.entries()) - 遍历自身属性(包括
Object.getOwnPropertySymbols())并递归克隆值
为什么避免 JSON 方法?
JSON.parse(JSON.stringify(obj)) 表面简单,但存在本质缺陷:
- ❌ 所有原型信息丢失,结果总是
Object.prototype实例 - ❌
Date变字符串、RegExp变空对象、Map/Set变空对象、函数/Symbol/undefined 直接被忽略 - ❌ 遇到循环引用立即报错:
TypeError: Converting circular structure to JSON - ⚠️ 仅适合纯数据对象(即“可 JSON 序列化”的场景),不可用于行为依赖原型的类实例
存入 Map 时要注意什么?
直接 map.set(key, obj) 存的是引用;若后续修改该对象,Map 中取出来的也会变。安全做法是:
- 先用
structuredClone(obj)得到独立副本 - 再
map.set(key, clonedObj) - 验证:修改
clonedObj.nested.prop不会影响原始对象或 Map 外其他引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











