趁着有时间研究了一下lodash库的一些函数的实现,发现里面对于一些传入参数的判定比较完备,而且也对一些原有的js函数进行了一些扩展。
after
1 | /** |
after的功能是待函数的触发了n次后才真正执行。after接受两个参数,一个是执行次数n,还有一个是待执行的函数,如果需要传入参数可以使用bind。
before
1 |
before的功能是限制函数的执行次数为n-1,如果n小于0则不执行。before接受两个参数,一个是执行次数n,还有一个是待执行的函数,如果需要传入参数可以使用bind。
chunk
1 |
首先引入了slice,其目的是利用扩展了的slice实现深复制,chunk接受两个参数,分别是待分组的数组array,以及每一分组的元素数目size,如果不够分则剩下的归为一组。
defer
1 | /** |
defer函数的功能是延迟执行,接受两个参数,分别是需要延迟执行的函数func,还有需要传给func的参数。
这里利用了settimeout将函数放入宏任务队列中实现了延迟,会在js主线程和微任务队列执行结束后执行。
delay
1 | /** |
delay接受至少三个参数,分别是需要延迟执行的函数func,延迟执行的时间wait,以及需要向func传入的参数,返回的是定时器的id,可以根据该id对定时器进行清除,delay实现了延迟执行的功能。
像这里这种在settimeout给func传参写法在IE9以下是不兼容的,需要polyfill
1 | (function(){ |
forEach && each
1 | import arrayEach from './.internal/arrayEach.js' //处理数组的遍历 |
forEach的功能是遍历数组和类数组,扩展了原生forEach的功能,主要是通过循环遍历之后将新变量注入到遍历器触发的函数中,实现了该功能,forEach还有一个alias为each
isArrayLike
1 | import isLength from './isLength.js' |
isArrayLike功能是判断是否是类数组对象,即value是否是有效的length,isLength函数实现了该功能,isArrayLike接受一个参数value,由于历史遗留问题,null也被视为一个对象,因此需要排除,同时Function类型也有length属性,但是代表的是参数的个数,不是类数组,因此也需要排除。
isLength
1 | //最大安全整数 |
isLenth的功能是判断该对象是否有一个有效的length属性,其接受一个参数value,value必须是Number类型且必须为非负整数,同时不能超过最大整数
last
1 | /** |
last函数的功能是获取数组最后一个元素,last接受一个参数,期望该参数是数组,并对其不是数组时进行了异常处理
slice
1 | /** |
根据提供的start、end参数,深复制一个数组的一部分。扩展了原生数组的slice的功能,start和end可以接受负数,表示到end的距离,start默认为0,end默认为传入数组的长度。利用>>>0右移实现取整,对start和end的可能情况进行处理,分别是start和end缺省时,start和end超出边界值时,start大于end时,start和end为非整数时
once
1 | import before from './before.js' |
once函数的功能是只会执行一次函数,通过before函数控制,once接受一个参数func