Lodash加減乘除add?subtract?multiply?divide方法源碼解讀
Lodash中文文檔
我們先看下Lodash中文文檔對add方法的解釋:
_.add(augend, addend)兩個數(shù)相加。
參數(shù)augend (number): 相加的第一個數(shù)。
addend (number): 相加的第二個數(shù)。
返回(number): 返回總和。
例子
_.add(6, 4); // => 10
add方法具體用法
接下來 我們通過源碼層次來看看add方法的具體用法
const add = createMathOperation((augend, addend) => augend + addend, 0) export default add
從源碼層次可以看出 add方法是createMathOperation方法返回的函數(shù),createMathOperation方法傳入兩個參數(shù):
第一個參數(shù)是一個普通的add邏輯方法
第二個參數(shù)是一個默認(rèn)值0
function createMathOperation(operator, defaultValue) { //返回一個函數(shù) value,other是調(diào)用lodash方法(例如_add)傳入的參數(shù) return (value, other) => { //如果第一個參數(shù)和第二個參數(shù)都沒有定義 則返回默認(rèn)值0 if (value === undefined && other === undefined) { return defaultValue } //如果第一個參數(shù)有值 第二個參數(shù)沒有值 則返回第一個參數(shù) if (value !== undefined && other === undefined) { return value } //如果第一個參數(shù)沒有值 第二個參數(shù)有值 則返回第二個參數(shù) if (other !== undefined && value === undefined) { return other } //如果第一個參數(shù)或者第二個參數(shù)為字符串(至少其中一個為字符串) 則將參數(shù)通過baseToString方法都轉(zhuǎn)換為字符串 if (typeof value === 'string' || typeof other === 'string') { value = baseToString(value) other = baseToString(other) } else { //如果兩個參數(shù)都不是字符串 則將參數(shù)通過baseToNumber方法都轉(zhuǎn)換為數(shù)字 value = baseToNumber(value) other = baseToNumber(other) } //這個時候?qū)⒈晦D(zhuǎn)換的參數(shù)傳入createMathOperation方法的第一個操作函數(shù),并返回結(jié)果 return operator(value, other) } }
代碼里的baseToString方法
function baseToString(value) { // 如果是字符串 直接返回 if (typeof value === 'string') { return value } // 如果是數(shù)組 遞歸轉(zhuǎn)換值(易受調(diào)用堆棧限制的影響) if (Array.isArray(value)) { return `${value.map(baseToString)}` } //如果是Symbol值 調(diào)用 Symbol.prototype.toString.call方法進(jìn)行轉(zhuǎn)換 例如:Symbol('a') 的轉(zhuǎn)換結(jié)果為 'Symbol(a)' if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : '' } //對字符串0 返回0 或者'-0'的處理 這塊我還沒有想到什么應(yīng)用場景 歡迎補充 const result = `${value}` return (result === '0' && (1 / value) === -INFINITY) ? '-0' : result }
代碼里的baseToNumber方法
function baseToNumber(value) { //如果是數(shù)字 直接返回 if (typeof value === 'number') { return value } //如果是Symbol類型 返回NAN if (isSymbol(value)) { return NAN } //將字符串通過+轉(zhuǎn)換為數(shù)字 return +value }
baseToString,baseToNumber方法中的isSymbol方法
function isSymbol(value) { const type = typeof value return type == 'symbol' || (type === 'object' && value != null && getTag(value) == '[object Symbol]') }
源碼解讀
通過源碼我們發(fā)現(xiàn)
——add() // 0 沒有傳參數(shù)直接返回默認(rèn)值0 _add(true) // true 只有第一個參數(shù) 返回 _add(undefined,'5') // '5' 只有第二個參數(shù)直接返回 _add(3,5) //返回 8 _add('3',5) // 返回 '35' _add('3',['5',4]) //返回 '35,4' 數(shù)組相加先調(diào)Array.prototype.toString方法 ['5',4]轉(zhuǎn)為'5,4' _add('3',Symbol('a')) //返回 '3Symbol(a)'
Lodash中 subtract方法(減法)、multiply方法(乘法)、divide方法(除法)都是通過createMathOperation實現(xiàn)的
subtract方法
* subtract(6, 4) * // => 2 */ const subtract = createMathOperation((minuend, subtrahend) => minuend - subtrahend, 0) export default subtract
multiply方法
* multiply(6, 4) * // => 24 */ const multiply = createMathOperation((multiplier, multiplicand) => multiplier * multiplicand, 1) export default multiply
divide方法
* divide(6, 4) * // => 1.5 */ const divide = createMathOperation((dividend, divisor) => dividend / divisor, 1) export default divide
以上就是Lodash 加減乘除 add、subtract、multiply、divide方法源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于Lodash 加減乘除的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
js面向?qū)ο缶幊蘋OP及函數(shù)式編程FP區(qū)別
這篇文章主要為大家介紹了js面向?qū)ο缶幊蘋OP及函數(shù)式編程FP的區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07