本文为读 lodash 源码的第二百五十四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
import baseToNumber from './baseToNumber.js'
import baseToString from './baseToString.js'createMathOperation 的作用是用来规范 Math 类目下,各种方法的参数,避免每个方法都需要自己处理一遍。
源码如下:
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)
}
}可以看到, createMathOperation 接收一个函数 operator 和一个默认值 defaultValue ,并且返回的也是一个函数,这个函数在处理完入参 value 和 other 后,最终调用的是 operator 得到结果。
if (value === undefined && other === undefined) {
return defaultValue
}两者同时为 undefined 时,直接返回默认值 defaultValue 即可。
if (value !== undefined && other === undefined) {
return value
}如果只有 other 是 undefined,则只返回 value 即可。
if (other !== undefined && value === undefined) {
return other
}只有 value 为 undefined,other 有值,则返回 other。
if (typeof value === 'string' || typeof other === 'string') {
value = baseToString(value)
other = baseToString(other)
}只要 other 或者 value 其中之一为 string 类型,都将两者转换为 string 类型,再交由 operator 处理。
else {
value = baseToNumber(value)
other = baseToNumber(other)
}其它情况下,将两者都转换为 number 类型,再交由 operator 处理。
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见: 
作者:对角另一面