lodash 核心源码学习(基于4.17.11版本)
源码地址 https://raw.githubusercontent.com/lodash/lodash/4.17.11-npm/core.js
13行: var undefined
es5之前 undefined 可以被 window.undefined = '我被覆盖了'这样的操作所覆盖,所以定义了未初始化的undefined,此时undefined变量的值一定是undefined,避免全局undefined变量被覆盖导致判断不准的问题。
74行 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports
和77行 var freeModule = typeof module == 'object' && object && !module.nodeType && module
检测自由变量exports, module 是否存在,
这里 !exports.nodeType作用:用于确保 exports 不是dom节点 。
由于在新版浏览器中 ,可以不用声明直接获取id的元素, 若定义了类似<div id='epxorts'></div>
的话,直接打印 exports 的结果为该dom元素 。
89-92行 ,作用: 将一个数组的每一个元素添加到另一个数组
function arrayPush(array, values) { array.push.apply(array, values); return array;
}复制代码
这里用了apply的特性,apply后的第一个参数会代替原函数的this对象,第二个参数为传入函数的参数,且为数组形式, 那么某种程度就相当于变成了 array.push(...values)这样
105-115行,作用: 找到下标,在_.findIndex有引用
function baseFindIndex(array, predicate, fromIndex, fromRight) { var length = array.length, index = fromIndex + (fromRight ? 1 : -1); while ((fromRight ? index-- : ++index < length)) { if (predicate(array[index], index, array)) {return index; } } return -1;
}复制代码
解析:predicate为查找规则,
1. 未传入 fromRight , 检索数组下标大于等于fromIndex的值, index初始值为 fromIndex - 1,循环中先将index + 1(先将多减的 1 加回来)然后判断是否小于数组长度,符合时判断是否符合查找规则
2.传入 fromRight , 检索数组下标小于等于fromIndex的值, index初始值为 fromIndex + 1,循环中先判断 index 是否为真,真时使用 index - 1 作为下标取数组元素传入查找规则
这里官方例子给的predicate参数只有当前元素,其实有三个, 当前元素,当前元素下标,原数组,有需要可以自己组合
124-128行, 作用:找到对象某个键的值,_.property有引用 ,不支持深层查找
function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; }复制代码
137-141行仅是把参数对调了一下
function basePropertyOf(object) { return function(key) { return object == null ? undefined : object[key]; }; }复制代码
相当于对传入的object先进行了一步判断是否存在
待续
lodash 核心源码学习(基于4.17.11版本)相关推荐
- 读zepto核心源码学习JS笔记(3)--zepto.init()
上篇已经讲解了zepto.init()的几种情况,这篇就继续记录这几种情况下的具体分析. 1. 首先是第一种情况,selector为空 既然是反向分析,那我们先看看这句话的代码; if (!selec ...
- 新书上市 | Vue 3.0 核心源码解析,这本书给Vue学习提供新方法
Vue.js 作为一款极简的 MVVM 框架,因其轻量.易上手,得到了众多开发者的喜爱. 自从 2014 年 Vue 诞生以来,这个框架设计的初衷,尤大说只是为了设计一个让自己用起来舒服的框架,随着受 ...
- Android版数据结构与算法(五):LinkedHashMap核心源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 上一篇基于哈希表实现HashMap核心源码彻底分析 分析了HashMap的源码,主要分析了扩容机制,如果感兴趣的可以去看看,扩容机制那几行最难懂的 ...
- 手撕spring核心源码,彻底搞懂spring流程
引子 十几年前,刚工作不久的程序员还能过着很轻松的日子.记得那时候公司里有些开发和测试的女孩子,经常有问题解决不了的,不管什么领域的问题找到我,我都能帮她们解决.但是那时候我没有主动学习技术的意识,只 ...
- SpringCloud Alibaba——精读Nacos+CMDB+核心源码阅读(7w字长篇)
文章目录 Nacos 1.介绍 2.使用场景 2.1.动态配置服务 2.2.服务发现及管理 2.2.1.服务注册 2.2.2.服务心跳 2.2.3.服务同步 2.2.4.服务发现 3.环境搭建 3.1 ...
- MyBatis核心源码剖析(SqlSession XML解析 Mapper executor SQL执行过程 自定义类型处理器 缓存 日志)
MyBatis核心源码剖析 MyBatis核心源码剖析 1 MyBatis源码概述 1.1 为什么要看MyBatis框架的源码 1.2 如何深入学习MyBatis源码 1.3 源码分析的5大原则 2 ...
- halcon区域腐蚀膨胀算子_超越halcon速度的二值图像的腐蚀和膨胀,实现目前最快的半径相关类算法(附核心源码)。...
超越halcon速度的二值图像的腐蚀和膨胀,实现目前最快的半径相关类算法(附核心源码). 发布时间:2019-03-20 12:32, 浏览次数:1259 , 标签: halcon 我在两年前的博客里 ...
- halfstone 原理_HashMap的结构以及核心源码分析
摘要 对于Java开发人员来说,能够熟练地掌握java的集合类是必须的,本节想要跟大家共同学习一下JDK1.8中HashMap的底层实现与源码分析.HashMap是开发中使用频率最高的用于映射(键值对 ...
- 面试官系统精讲Java源码及大厂真题 - 09 TreeMap 和 LinkedHashMap 核心源码解析
09 TreeMap 和 LinkedHashMap 核心源码解析 更新时间:2019-09-05 10:15:03 人的影响短暂而微弱,书的影响则广泛而深远. --普希金 引导语 在熟悉 HashM ...
最新文章
- 敏捷软件开发之何为敏捷开发
- python常用面试题_史上最全Python工程师常见面试题集锦,有这一份就够了
- Misc-----[2021祥云杯初赛]鸣雏恋 提取压缩包文件图片名8个为一组 转ASC码base64转图片
- 美团杯2020 - 平行四边形(原根)
- C++ vector容器类型 (摘自漫步云端的博客)
- Jquery——hover与toggle
- jqgrid 使用小记——与springboot jpa 一起使用的分页,翻页。(使用springboot jpa 原生的分页)...
- hdu 3466 Proud Merchants
- 2017中国屏幕分辨率统计
- 微信小程序中如何应用音频
- 如何防止短信API接口遍历
- 电脑怎么压缩jpg图片?如何压缩照片并保持清晰?
- 高精度电压基准电路-TL431实现
- httpclient
- html怎么把盒子做成超链接,把整个DIV变成超链接
- h5物体拖动_HTML5原生拖拽/拖放(drag drop)详解
- 【人工智能项目】缺陷检测分割数据集相关整理分享
- Qt编写的项目作品30-录音播放控件(雨田哥作品)
- 华为荣耀9升级鸿蒙os,华为荣耀9款手机可升级EMUI 11了!优先升鸿蒙OS
- VHDL数字频率计的设计