高级深拷贝函数需支持动态白/黑名单(白名单优先)、精准类型处理(date/map等特殊对象单独复制)、weakmap防循环引用,并可配置函数/symbol保留策略及嵌套路径过滤。

要编写支持动态白名单和黑名单的高级深拷贝函数,核心在于控制属性遍历与复制逻辑,同时保持对循环引用的安全处理、类型精准识别以及可扩展性。下面分几个关键点说明实现思路和实用写法。
支持白名单与黑名单的属性过滤机制
白名单(whitelist)表示只拷贝指定键;黑名单(blacklist)表示跳过指定键。两者可共存,但白名单优先级更高(即白名单存在时,黑名单自动失效)。建议用 Set 或数组传入,并在递归前统一预处理:
- 若 whitelist 非空,仅遍历 whitelist 中存在的 key(即使原对象有其他属性也不处理)
- 若 whitelist 为空但 blacklist 非空,跳过 blacklist 中的 key
- 支持嵌套路径语法(如
"user.profile.name"),需配合路径解析器做深层过滤(进阶可选)
保留原始类型语义与特殊对象处理
深拷贝不能简单用 JSON.parse(JSON.stringify()),必须手动区分类型并分别处理:
- null / undefined / primitive:直接返回
- Date / RegExp / Map / Set / ArrayBuffer / TypedArray:构造新实例并复制内容
- 普通对象 / 数组:递归拷贝,同时注入白/黑名单上下文
- 函数 / Symbol 键 / 不可枚举属性:默认跳过(可配置是否保留)
安全处理循环引用与递归上下文传递
用 WeakMap 缓存已拷贝的对象引用,避免无限递归。关键是把过滤规则(whitelist/blacklist)随递归深度一起传递下去,确保子层级也受控:
- 每次进入对象/数组拷贝时,传入当前层级的过滤配置(可继承父级,也可被子路径覆盖)
- WeakMap 的 key 是原始对象,value 是对应的新对象,不污染源数据
- 遇到已缓存对象,直接返回缓存值,不重复过滤或遍历
使用示例与灵活调用方式
函数可设计为高阶形式,先配置策略再执行拷贝,提高复用性:
const deepClone = createDeepCloner({
whitelist: ['id', 'name', 'meta'],
blacklist: ['password', 'token'],
keepFunctions: false,
keepSymbols: false
});
const cloned = deepClone(originalObj);
也可支持运行时传参:
deepClone(obj, {
whitelist: ['a', 'b.c'],
customReviver: (key, value) => key === 'timestamp' ? new Date(value) : value
});
这样既满足策略复用,又保留按需调整的灵活性。











