源码地址 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先进行了一步判断是否存在
待续