不定期更新的源码阅读日常——lodash-2

  今天我们来读lodash的深拷贝部分代码。
  lodash的clonecloneDeep两个方法分别对应浅拷贝深拷贝。两个函数其实都依赖于baseClone方法,通过传入一个标识来进行深拷贝或者浅拷贝的区分,我们来简单看一下baseClone的入参。

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1,
    CLONE_FLAT_FLAG = 2,
    CLONE_SYMBOLS_FLAG = 4;
  
function clone(value) {
   
  return baseClone(value, CLONE_SYMBOLS_FLAG);
}

function cloneDeep(value) {
   
  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
}

/**
 * @param {*} value The value to clone.
 * @param {boolean} bitmask The bitmask flags.
 *  1 - Deep clone
 *  2 - Flatten inherited properties
 *  4 - Clone symbols
 * @param {Function} [customizer] The function to customize cloning.
 * @param {string} [key] The key of `value`.
 * @param {Object} [object] The parent object of `value`.
 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
 * @returns {*} Returns the cloned value.
 */
function baseClone(value, bitmask, customizer, key, object, stack) {
   
  // ... 暂时省略内容代码
}

来看下函数baseClone的入参:

  1. value代表需要进行拷贝的对象。
  2. bitmask就是深浅拷贝的一个标识,我们可以看到clone传入的是4,cloneDeep传入的为1 | 4为5。
  3. customizer这个参数是为cloneWith的api进行服务的,是自定义的一个clone函数,与深拷贝无关,这里我们先忽略。
  4. key对应的为当前拷贝对象的key,这是后续递归调用拷贝对象值的时候所用到的。
  5. object对应的为value的所属对象,也是后续递归所用到的。
  6. stack为一个类似于Map数据结构的数组,它以一个二维数组的形式,保存了每次需要进行克隆的值和返回的值,即保存为[value, result]的形式。具体的作用到函数代码分析中去查看。

  baseClone的深拷贝部分逻辑总体思路很简单,当判断为基本类型的时候,直接返回返回需要拷贝的对象。当为引用类型的时候,根据为数组或者对象,进行一个循环,递归使用baseClone继续进行拷贝,直到基本的数据类型为止。但这种思路会产生一个问题,当两个对象循环引用的时候,代码会无限循环下去,就如下面这种情况:

var a = {
   };
var b = {
    result: a }<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值