先介绍下该方法的参数baseClone(value, bitmask, customizer, key, object, stack) value:需要拷贝的对象 bitmask:位掩码,其中 1 是深拷贝,2 拷贝原型链上的属性,4 是拷贝 Symbols 属性 customizer:定制的clone函数 key:传入 value 值的 key object:传入 value 值的父对象 stack:Stack 栈,用来处理循环引用 我...
循环引用的问题:子对象保存的是对象的引用,实际上的数值还是指向同一个对象,所以在递归过程当中,一遇到循环引用,就会进入新的递归过程,无限套娃,这个子对象一直没有解除递归的条件,最后会死循环,导致拷贝爆栈。 所以在实现深拷贝的过程当中,我们需要对循环引用的情况进行另外处理。 结合循环引用情况,梳理下这个深拷贝...
可以看出lodash中主要通过缓存每个值对应的拷贝结果来解决循环引用的问题。 针对上面的这个存在循环引用的对象,我们可以来按步骤进行分析一下cloneDeep(objb)时是如何解决循环引用的: 1. 处理objb对象,stack.get(objb)不存在,所以将代表objb的拷贝结果result放到stack中,然后逐个处理objb上的属性 2. 处理objb中的b...
深拷贝是指创建一个新对象,并递归地复制原对象的所有属性,包括嵌套的对象和数组。这意味着新对象与原对象完全独立,修改新对象不会影响到原对象。lodash的_.cloneDeep方法通过递归遍历对象的所有层级,为每个层级创建新的副本,从而实现深拷贝。 2. 使用lodash进行深拷贝的示例代码 javascript import _ from 'lodash'; ...
这个自定义函数可以用来处理那些默认复制逻辑无法处理的复杂情况,比如循环引用的对象。 4. 性能优化 为了提高深拷贝的性能,Lodash 使用了多种优化手段,如缓存已经复制过的对象、避免不必要的复制等。 5. 实际应用 在实际项目中,深拷贝可以用于很多场景,比如需要保留原始对象不变而创建副本进行修改的情况。使用 Lodash ...
1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用 2.深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用” 为什么要使用深拷贝? 我们希望在改变新的数组(对象)的时候,不改变原数组(对象) ...
bitmask:位掩码,其中 1 是深拷贝,2 拷贝原型链上的属性,4 是拷贝 Symbols 属性 customizer:定制的clone函数 key:传入 value 值的 key object:传入 value 值的父对象 stack:Stack 栈,用来处理循环引用 我将分成以下几部分进行讲解,可以选择自己感兴趣的部分阅读。
接着上一篇文章lodash 是如何实现深拷贝的(上),今天会继续解读 _.cloneDeep 的源码,来看看 lodash 是如何处理对象、函数、循环引用等的深拷贝问题的。 baseClone 的源码实现 先回顾一下它的源码,以及一些关键的注释 function baseClone(value, bitmask, customizer, key, object, stack) { ...
1 对象的深度拷贝 对象的深度克隆是很困难的。JSON.parse(JSON.stringify(obj))可以实现对象的深度克隆。但有如下缺点: 值类型是 undefined、function、symbol 的属性会被过滤掉。 是类型是 set、map 会被被处理成空对象。 对象的属性间出现循环引用时,会报错。
不经让我想到,lodash 中的_.cloneDeep方法。它是如何实现深拷贝的呢?今天,就让我们来具体地解读一下 _.cloneDeep 的源码实现。 源码中的内容比较多,为了能将知识点讲明白,也为了更好的阅读体验,将会分为上下 2 篇进行解读。今天主要会涉及位掩码、对象判断、数组和正则的深拷贝写法。