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變量被覆蓋導(dǎo)致判斷不準(zhǔn)的問題。
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節(jié)點 。
由于在新版瀏覽器中 ,可以不用聲明直接獲取id的元素, 若定義了類似<div id='epxorts'></div>的話,直接打印 exports 的結(jié)果為該dom元素 。
89-92行 ,作用: 將一個數(shù)組的每一個元素添加到另一個數(shù)組
function arrayPush(array, values) { array.push.apply(array, values); return array; }復(fù)制代碼這里用了apply的特性,apply后的第一個參數(shù)會代替原函數(shù)的this對象,第二個參數(shù)為傳入函數(shù)的參數(shù),且為數(shù)組形式, 那么某種程度就相當(dāng)于變成了 array.push(...values)這樣
105-115行,作用: 找到下標(biāo),在_.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; }復(fù)制代碼解析:predicate為查找規(guī)則,?
1. 未傳入 fromRight , 檢索數(shù)組下標(biāo)大于等于fromIndex的值, index初始值為 fromIndex - 1,循環(huán)中先將index + 1(先將多減的 1 加回來)然后判斷是否小于數(shù)組長度,符合時判斷是否符合查找規(guī)則
2.傳入 fromRight , 檢索數(shù)組下標(biāo)小于等于fromIndex的值, index初始值為 fromIndex + 1,循環(huán)中先判斷 index 是否為真,真時使用 index - 1 作為下標(biāo)取數(shù)組元素傳入查找規(guī)則
這里官方例子給的predicate參數(shù)只有當(dāng)前元素,其實有三個, 當(dāng)前元素,當(dāng)前元素下標(biāo),原數(shù)組,有需要可以自己組合
124-128行, 作用:找到對象某個鍵的值,_.property有引用 ,不支持深層查找
function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; }復(fù)制代碼137-141行僅是把參數(shù)對調(diào)了一下
function basePropertyOf(object) { return function(key) { return object == null ? undefined : object[key]; }; }復(fù)制代碼相當(dāng)于對傳入的object先進(jìn)行了一步判斷是否存在
待續(xù)
總結(jié)
以上是生活随笔為你收集整理的lodash 核心源码学习(基于4.17.11版本)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: thinkphp源码分析(一)—开门篇
- 下一篇: Redis scan命令原理