最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lodash加減乘除add?subtract?multiply?divide方法源碼解讀

 更新時間:2023年05月23日 14:17:36   作者:大山  
這篇文章主要介紹了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ù)是一個默認值0

function createMathOperation(operator, defaultValue) {
  //返回一個函數(shù) value,other是調(diào)用lodash方法(例如_add)傳入的參數(shù)
  return (value, other) => {
    //如果第一個參數(shù)和第二個參數(shù)都沒有定義 則返回默認值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方法進行轉(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ù)直接返回默認值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方法源碼解讀的詳細內(nèi)容,更多關(guān)于Lodash 加減乘除的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript高級程序設(shè)計之基本引用類型

    JavaScript高級程序設(shè)計之基本引用類型

    這篇文章主要介紹了JavaScript高級程序設(shè)計之基本引用類型,引用值(對象)都是某個特定的引用類型的實例對象,例如 Date類型、Function類型,RegExp 正則表達式類型等等。JavaScript內(nèi)置了一些常用的引用類型給開發(fā)者使用。下面來看看文章詳細內(nèi)容
    2021-11-11
  • JS前端宏任務(wù)微任務(wù)及Event Loop使用詳解

    JS前端宏任務(wù)微任務(wù)及Event Loop使用詳解

    這篇文章主要為大家介紹了JS前端宏任務(wù)微任務(wù)及Event Loop使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 微信瀏覽器禁止頁面下拉查看網(wǎng)址實例詳解

    微信瀏覽器禁止頁面下拉查看網(wǎng)址實例詳解

    這篇文章主要介紹了微信瀏覽器禁止頁面下拉查看網(wǎng)址實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 微信小程序 解析網(wǎng)頁內(nèi)容詳解及實例

    微信小程序 解析網(wǎng)頁內(nèi)容詳解及實例

    這篇文章主要介紹了微信小程序 解析網(wǎng)頁內(nèi)容詳解及實例的相關(guān)資料,這里使用爬蟲對復雜的網(wǎng)頁進行抓取,遇到些問題,這里整理下并解決,需要的朋友可以參考下
    2017-02-02
  • 微信小程序頁面開發(fā)注意事項整理

    微信小程序頁面開發(fā)注意事項整理

    這篇文章主要介紹了微信小程序頁面開發(fā)注意事項整理的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 微信小程序 slider的簡單實例

    微信小程序 slider的簡單實例

    這篇文章主要介紹了微信小程序 slider的簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • JS按鈕連擊和接口調(diào)用頻率限制防止客戶爆倉

    JS按鈕連擊和接口調(diào)用頻率限制防止客戶爆倉

    這篇文章主要為大家介紹了JS按鈕連擊和接口調(diào)用頻率限制防止客戶集體爆倉詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • JS高級ES6的6種繼承方式

    JS高級ES6的6種繼承方式

    這篇文章主要和大家分享的事JS高級ES6的6種繼承方式,繼承是面向?qū)ο笾欣仙U劦囊粋€內(nèi)容,在ECMAScript6之前,JavaScript中的繼承可謂是非常的繁瑣的,有各種各樣的繼承,本質(zhì)上所有的繼承都是離不開原型鏈的,更多詳細內(nèi)容請感興趣的小伙伴參考下面文章內(nèi)容吧
    2021-12-12
  • 羊了個羊的中強大的Grid布局

    羊了個羊的中強大的Grid布局

    這篇文章主要為大家介紹了羊了個羊的中強大的Grid布局詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Js視頻播放器插件Video.js使用方法詳解

    Js視頻播放器插件Video.js使用方法詳解

    Video.js 是一個通用的在網(wǎng)頁上嵌入視頻播放器的JS庫,Video.js自動檢測瀏覽器對HTML5的支持情況,如果不支持HTML5則自動使用Flash 播放器,推薦大家好好看看
    2020-02-02

最新評論

余干县| 礼泉县| 子长县| 通渭县| 万载县| 夏河县| 清徐县| 西华县| 盐源县| 云龙县| 彩票| 东台市| 铜陵市| 吉首市| 紫金县| 黄平县| 道孚县| 易门县| 岚皋县| 炉霍县| 武冈市| 五莲县| 射阳县| 精河县| 兴仁县| 宣恩县| 洞头县| 永清县| 金平| 清镇市| 青浦区| 津市市| 苏尼特右旗| 宝山区| 石景山区| 安宁市| 神农架林区| 梨树县| 若尔盖县| 永泰县| 安顺市|