共计 2036 个字符,预计需要花费 6 分钟才能阅读完成。
咱们先看下 Lodash 中文文档对 add 办法的解释:
_.add(augend, addend)
两个数相加。
参数
augend (number): 相加的第一个数。
addend (number): 相加的第二个数。
返回
(number): 返回总和。
例子
_.add(6, 4);
// => 10
接下来 咱们通过源码档次来看看 add 办法的具体用法
const add = createMathOperation((augend, addend) => augend + addend, 0)
export default add
从源码档次能够看出 add 办法是 createMathOperation 办法返回的函数,createMathOperation 办法传入两个参数:
第一个参数是一个一般的 add 逻辑办法
第二个参数是一个默认值 0
function createMathOperation(operator, defaultValue) {// 返回一个函数 value,other 是调用 lodash 办法 (例如_add) 传入的参数
return (value, other) => {
// 如果第一个参数和第二个参数都没有定义 则返回默认值 0
if (value === undefined && other === undefined) {return defaultValue}
// 如果第一个参数有值 第二个参数没有值 则返回第一个参数
if (value !== undefined && other === undefined) {return value}
// 如果第一个参数没有值 第二个参数有值 则返回第二个参数
if (other !== undefined && value === undefined) {return other}
// 如果第一个参数或者第二个参数为字符串(至多其中一个为字符串) 则将参数通过 baseToString 办法都转换为字符串
if (typeof value === 'string' || typeof other === 'string') {value = baseToString(value)
other = baseToString(other)
}
else {
// 如果两个参数都不是字符串 则将参数通过 baseToNumber 办法都转换为数字
value = baseToNumber(value)
other = baseToNumber(other)
}
// 这个时候将被转换的参数传入 createMathOperation 办法的第一个操作函数,并返回后果
return operator(value, other)
}
}
代码里的 baseToString 办法
function baseToString(value) {
// 如果是字符串 间接返回
if (typeof value === 'string') {return value}
// 如果是数组 递归转换值(易受调用堆栈限度的影响)if (Array.isArray(value)) {return `${value.map(baseToString)}`
}
// 如果是 Symbol 值 调用 Symbol.prototype.toString.call 办法进行转换 例如:Symbol('a') 的转换后果为 'Symbol(a)'
if (isSymbol(value)) {return symbolToString ? symbolToString.call(value) : ''
}
// 对字符串 0 返回 0 或者 '-0' 的解决 这块我还没有想到什么利用场景 欢送补充
const result = `${value}`
return (result === '0' && (1 / value) === -INFINITY) ? '-0' : result
}
代码里的 baseToNumber 办法
function baseToNumber(value) {
// 如果是数字 间接返回
if (typeof value === 'number') {return value}
// 如果是 Symbol 类型 返回 NAN
if (isSymbol(value)) {return NAN}
// 将字符串通过 + 转换为数字
return +value
}
baseToString,baseToNumber 办法中的 isSymbol 办法
function isSymbol(value) {
const type = typeof value
return type == 'symbol' || (type === 'object' && value != null && getTag(value) == '[object Symbol]')
}
通过源码咱们发现
_add(true) // 返回 true
_add(undefined,'5') // '5'
_add('3',5) // 返回 '35'
_add('3',['5',4]) // 返回‘35,4’_add('3',Symbol('a')) // 返回 '3Symbol(a)'
留神:Lodash 中 divide 办法(除法)、multiply 办法(乘法)、subtract 办法(减法)都是通过 createMathOperation 实现的
正文完
发表至: javascript
2023-05-22