「读懂源码系列3」lodash 是如何实现深拷贝的(上)

本文深入探讨lodash的_.cloneDeep方法实现,涉及位掩码技术、对象判断以及处理数组和正则表达式的方法。通过源码分析,解释位掩码在深拷贝中的作用,如何判断对象类型,并详细阐述了处理数组和正则的具体步骤,揭示了源码背后的逻辑。
摘要由CSDN通过智能技术生成

上一篇文章 《「前端面试题系列9」浅拷贝与深拷贝的含义、区别及实现》 中提到了深拷贝的实现方法,从递归调用,到 JSON,再到终极方案 cloneForce。

不经让我想到,lodash 中的 _.cloneDeep 方法。它是如何实现深拷贝的呢?今天,就让我们来具体地解读一下 _.cloneDeep 的源码实现。

源码中的内容比较多,为了能将知识点讲明白,也为了更好的阅读体验,将会分为上下 2 篇进行解读。今天主要会涉及位掩码、对象判断、数组和正则的深拷贝写法。

ok,现在就让我们深入源码,共同探索吧~

_.cloneDeep 的源码实现

它的源码内容很少,因为主要还是靠 baseClone 去实现。

/** Used to compose bitmasks for cloning. */
const CLONE_DEEP_FLAG = 1
const CLONE_SYMBOLS_FLAG = 4

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

刚看到前两行的常量就懵了,它们的用意是什么?然后,传入 baseClone 的第二个参数,似乎还将那两个常量做了运算,其结果是什么?这么做的目的是什么?

一番查找之后,终于明白这里其实涉及到了 位掩码 与 位运算 的概念。下面就来详细讲解一下。

位掩码技术

回到第一行注释:Used to compose bitmasks for cloning。意思是,用于构成克隆方法的位掩码。

从注释看,这里的 CLONE_DEEP_FLAG 和 CLONE_SYMBOLS_FLAG 就是位掩码了,而 CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG 其实是 位运算 中的 按位或 方法。

这里有个不常见的概念:位运算。MDN 上对位运算的解释是:它经常被用来创建、处理以及读取标志位序列——一种类似二进制的变量。虽然可以使用变量代替标志位序列,但是这样可以节省内存(1/32)。

不过实际开发中,位运算用得很少,主要是因为位运算操作的是二进制位,对开发者来说不太好理解。用得少,就容易生疏。但实际上,位运算是一种很棒的思想,它计算得更快,代码量还更少。位运算,常用于处理同时存在多个布尔选项的情形。掩码中的每个选项的值都是 2 的幂,位运算是 32 位的。

在计算机程序的世界里,所有的数据都是以二进制的形式储存的。位运算,说白了就是直接对某个数据在内存中的二进制位,进行运算操作。比如 &|~^>>,这些都是 按位运算符,它们有一些神奇的用法。以系统权限为例:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Github下载地址:https://github.com/XLAccount/MiaoBo 项目详解地址:http://www.code4app.com/blog-843201-350.html 快速集成RTMP的视频推流教程:http://www.code4app.com/blog-843201-315.html ffmpeg常用命令操作:http://www.code4app.com/blog-843201-326.html #关于IJKMediaFramework/IJKMediaFramework.h找不到的问题,下载后直接拉到项目中即可 下载地址:https://pan.baidu.com/s/1boPOomN 密码::9yd8 #BUG修复: 解决登录程序偶尔崩溃,修复轮播图片和页面控制器叠加等问题,修复新浪授权登录 (2016.9.7) 解决程序运行中偶尔崩溃问题,解决连续下拉刷新崩溃问题,优化代码 (2016.9.8) 优化直播页面,减少不必要的性能消耗,增加用户体验 (2016.9.11) 适配5s以上的机型除了6sPlus和6Plus延迟较大外,其余延迟都较小,网速好的话可以忽略不计 (2016.9.12) 新版本极大优化程序性能,修复关注数据异常等小问题,重新布局热门页面,减少因反复加载带来的性能消耗 (2016.9.13) 增加个人中心页面,采用下拉放大图片 ➕ 波纹效果 (2016.9.14) ![image text](https://github.com/XLAccount/ALLGIFS/blob/master/psb.gif) 展示图片 ![image](https://github.com/XLAccount/ALLGIFS/blob/master/psb-1.gif) 展示图片 ![image text](https://github.com/XLAccount/ALLGIFS/blob/master/psb-2.gif) 展示图片 ![image text](https://github.com/XLAccount/ALLGIFS/blob/master/psb-3.gif) 展示图片 感谢大神Monkey_ALin http://www.jianshu.com/users/9723687edfb5/latest_articles 的demo支持
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值