深拷贝验证需确保引用隔离、特殊类型保真、循环引用安全及可选的不可枚举属性与原型链完整。先确认 copy !== original,再断言嵌套对象/数组引用不同;Date、RegExp、Map/Set、边界值需类型与内容一致;循环引用须不报错且闭环;不可枚举属性、Symbol键、原型链按声明覆盖。

验证引用隔离是核心前提
深拷贝是否生效,最直接的判断标准是修改副本后原对象不被影响。只用 toEqual 比较结构一致远远不够,必须配合 toBe 确保引用地址不同。
- 对嵌套对象、数组分别赋新值,检查原始对象对应字段未变化
- 断言
copy.obj !== original.obj和copy.arr !== original.arr都为 true - 避免只改顶层属性(如
copy.a = 10),那无法区分深浅拷贝
覆盖特殊内置类型和边界值
JSON 方式或简单递归常在这些地方失效,必须单独构造并断言。
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
-
Date:拷贝后仍是
instanceof Date,且getTime()值相等 -
RegExp:保留
source、flags和lastIndex -
Map / Set:元素数量、键值对内容一致,且
copy !== original -
null / undefined / NaN / Infinity:类型和值都保持原样(
typeof NaN === 'number')
必须测试循环引用场景
若你的深拷贝实现支持循环引用(如用了 WeakMap 缓存),不测这个等于没测。
- 构造自引用对象:
const obj = {}; obj.self = obj; - 调用深拷贝后不报错、不卡死、不栈溢出
- 验证结果中
copy.self === copy,结构完整闭环
按需检查不可枚举属性与原型链
这不是所有深拷贝函数的义务,但如果你的文档或设计声明“完全复制对象状态”,就必须覆盖。
- 用
Object.defineProperty添加不可枚举属性,检查是否出现在副本中 - 创建带自定义
prototype的对象,验证copy.constructor === original.constructor - 含
Symbol键时,用Object.getOwnPropertySymbols()检查 key 和 value 是否完整迁移

















