为何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
相关产品推荐
相关产品推荐

