You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何clone-deep与Lodash的cloneDeep有时返回原实例?

原因分析

深克隆工具在处理特定类型的值时,会直接返回原值或原引用,导致克隆结果与原对象通过===判断全等,触发debugger。常见场景包括:

  • 基本数据类型:undefined、null、字符串、数字、布尔值、Symbol、BigInt 均为值类型,深克隆不会创建新实例,直接返回原值。示例:

    const str = "test";
    console.log(cloneDeep(str) === str); // 输出 true
    
  • 函数对象:函数的闭包、内部状态无法被完整序列化复制,lodash、clone-deep 这类库都会直接返回原函数的引用。示例:

    const func = () => console.log("hello");
    console.log(_.cloneDeep(func) === func); // 输出 true
    
  • 全局单例对象:Math、JSON 这类内置全局单例,克隆工具会直接返回原引用,因为它们本身是不可变的全局实例,无需克隆。

  • 不可克隆的内置对象:WeakMap、WeakSet 这类依赖垃圾回收机制的对象无法被深克隆,克隆后返回原引用。

你可以在debugger断点处打印obj的类型和具体值,就能确认属于哪种场景。

内容的提问来源于stack exchange,提问作者vmachacek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:45:59