JavaScript深拷贝Date和RegExp的核心挑战是二者无法通过JSON序列化还原:Date会丢失时区与毫秒精度,需用new Date(original.getTime())重建;RegExp的source、flags等属性会消失,须用new RegExp(source, flags)构造,并兼容IE;还需显式拷贝自有属性、保留原型链,并在循环引用中用WeakMap缓存已处理引用。

JavaScript 中深拷贝函数处理 Date 和 RegExp 对象时,核心挑战在于:它们是具有行为和状态的内置对象,不能靠简单遍历或序列化还原。
Date 对象的时间精度与时区信息易丢失
JSON 方法会把 Date 实例转成 ISO 字符串(如 "2024-05-10T08:30:00.000Z"),再 parse 后只剩字符串,不再是 Date 实例——时区、毫秒精度、getTime() 方法全部消失。手动实现需识别 [object Date] 或用 instanceof Date,然后调用 new Date(original.getTime()) 重建,才能保留原始时间值与时区上下文。
RegExp 对象的模式、标志与执行状态无法被 JSON 表达
正则表达式经 JSON.stringify() 后变成空对象 {},source、flags(如 "gim")、lastIndex 等关键属性全丢失。正确重建必须提取 original.source 和 original.flags,再用 new RegExp(source, flags) 构造。注意 IE 不支持 .flags 属性,需兼容性回退,例如通过 toString().match(/\/(.+)\/([gimy]*)/) 解析。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
自定义属性与原型链容易被忽略
即使 Date 或 RegExp 被正确重建,若原始实例上挂了额外属性(如 date.userId = 1001 或 regex.name = "emailPattern"),标准深拷贝逻辑通常不会复制这些非固有属性。因为它们不属于该类型的标准结构,需要在判断类型后显式遍历并拷贝自有属性。同样,若对象继承自自定义原型,仅用 Object.create(Object.getPrototypeOf(obj)) 可保留原型链,但需确保后续属性赋值不破坏继承关系。
立即学习“Java免费学习笔记(深入)”;
循环引用场景下需兼顾类型识别与缓存机制
当 Date 或 RegExp 出现在含循环引用的对象中(例如 obj.a = new Date(); obj.b = obj;),深拷贝函数既要识别并单独处理这两类对象,又得用 WeakMap 缓存已拷贝过的引用,避免重复创建或无限递归。这意味着类型判断逻辑必须在缓存查重之后、递归进入之前执行,顺序错位会导致重建失效或内存泄漏。

















