这个文章的意义在于 想学习loadsh的所有源码 从github的顺序开始看(严格按照顺序的,所以难免有集合函数数组这样的跳跃) loadsh很多运算我们也可以写出来,但是严谨性可复用性却没有loadsh强. __________________是分界线,因为lodash里面有很多内部函数,先解读内部函数再写主源码 1.add.js import createMathOperation createMathOperation 是lodash内部源码的一个创建Math的一个运算函数 验证参数将其转化为数字,如果其中有一个不能转换就返回可以转换的那个.如果两个都不行,就返回默认的,这里的0相当于报错. ^(* ̄(oo) ̄)^(安利一波TS TS的类型检测就应该不用这些代码了.) function createMathOperation(operator, defaultValue) { return (value, other) => { if (value === undefined && other === undefined) { return defaultValue } if (value !== undefined && other === undefined) { return value } if (other !== undefined && value === undefined) { return other } if (typeof value === 'string' || typeof other === 'string') { value = baseToString(value) other = baseToString(other) } else { value = baseToNumber(value) other = baseToNumber(other) } return operator(value, other) } }
const add = createMathOperation((augend, addend) => augend + addend, 0) //这里就是调用了 2.after.js 调用>n次后 运行 function after(n, func) { if (typeof func != 'function') { throw new TypeError('Expected a function') } return function(...args) { if (--n < 1) { return func.apply(this, args) } } } //基本的闭包和柯里化 这里注意的点就是 --这个自减顺序 3.
4.attempt.js import isError function attempt(func, ...args) { try { return func(...args) } catch (e) { return isError(e) ? e : new Error(e) } } //调用函数返回错误或者结果,就是一个检测工具函数 5.before.js function before(n, func) { let result if (typeof func != 'function') { throw new TypeError('Expected a function') } return function(...args) { if (--n > 0) { result = func.apply(this, args) } if (n <= 1) { func = undefined } return result } } //跟after是一个相反类似函数 6. 7.castArray.js //转化值为数组 function castArray(...args) { if (!args.length) { return [] } const value = args[0] return Array.isArray(value) ? value : [value] } 8.ceil.js
9.chunk.js //切割数组 function chunk(array, size) { size = Math.max(size, 0) const length = array == null ? 0 : array.length if (!length || size < 1) { return [] } le