JavaScript實用庫:Lodash源碼數字函數解析clamp、baseClamp、inRange、baseInRange、random

本章的內容主要是:clamp、baseClamp、inRange、baseInRange、random


在這裏插入圖片描述

Lodash是一個非常好用方便的JavaScript的工具庫,使得我們對數據處理能夠更加得心應手

接下來我要對Lodash的源碼進行剖析學習
每天幾個小方法,跟着我一起來學lodash吧


1、_.clamp(number, [lower], upper)

該方法的作用是返回限制在 lower 和 upper 之間的值。

下面我們來看例子感受一下:
在這裏插入圖片描述

可以看到,第一個例子,第一個參數是-10,-5與它比較相近,所以輸出了-5,我們可以理解成輸出比較接近的值
第二個例子自然輸出了與10比較接近的5了

下面我們來看源碼:

function clamp(number, lower, upper) {
  //如果上限值未定義,則下限值的值爲上限值
  //並且使下限值爲未定義
  if (upper === undefined) {
    upper = lower;
    lower = undefined;
  }
  //如果上限值定義了,那麼下限值也一定定義了,toNumber是將數據裝換爲數字
  if (upper !== undefined) {
    upper = toNumber(upper);
    upper = upper === upper ? upper : 0;
  }
  //這一步也是進行了與上限值同樣的處理
  if (lower !== undefined) {
    lower = toNumber(lower);
    lower = lower === lower ? lower : 0;
  }
  //其實前面也都只是對數據進行了一下確定,最重要的過程在覈心函數中處理
  return baseClamp(toNumber(number), lower, upper);
}

module.exports = clamp;

我們接下來看核心函數baseClamp的源碼是怎麼的吧


2、baseClamp

同樣的,沒有例子,直接看源碼了
看起來還是比較簡單的

function baseClamp(number, lower, upper) {
  if (number === number) {
    if (upper !== undefined) {
      //如果上限制大於number,則number的值不變,反之,number賦值upper的值
      number = number <= upper ? number : upper;
    }
    if (lower !== undefined) {
      //同樣的,如果下限值小於number,則number值不變,防止,number賦值lower的值
      number = number >= lower ? number : lower;
    }
  }
  return number;
}

module.exports = baseClamp;

代碼量比較少,還是挺容易理解的


3、_.inRange(number, [start=0], end)

直接引用官方解釋:
檢查 n 是否在 start 與 end 之間,但不包括 end。 如果 end 沒有指定,那麼 start 設置爲0。 如果 start 大於 end,那麼參數會交換以便支持負範圍。

下面我們來看官方給出的例子:
在這裏插入圖片描述

也就是說,我們第一個參數是要檢查的數據,如果只有兩個參數時,第二個參數爲end的值,start的值默認爲0,當有三個參數時,第二個參數爲start,第三個參數爲end,如果start的值大於end,則進行交換

下面我們來看源碼吧

function inRange(number, start, end) {
  start = toFinite(start);
  //這裏就是我們看到的,如果只有兩個參數時,start爲0,end的值爲第二個參數
  if (end === undefined) {
    end = start;
    start = 0;
  } else {
    end = toFinite(end);
  }
  //將number裝換爲數字,避免特殊數據傳入
  number = toNumber(number);
  return baseInRange(number, start, end);
}

module.exports = inRange;

最重要的還是在baseInRange函數中
下面我們繼續來看一下


4、baseInRange

我們直接看源碼:

var nativeMax = Math.max,
    nativeMin = Math.min;

function baseInRange(number, start, end) {
  //輸出爲True的條件爲:number的值要大於start並且number的值要小於end,所以就達到了我們想要的目的,判斷是否在範圍內。
  return number >= nativeMin(start, end) && number < nativeMax(start, end);
}

module.exports = baseInRange;

5、_.random([lower=0], [upper=1], [floating])

官方解釋:產生一個包括 lower 與 upper 之間的數。 如果只提供一個參數返回一個0到提供數之間的數。 如果 floating 設爲 true,或者 lower 或 upper 是浮點數,結果返回浮點數。

注意: JavaScript 遵循 IEEE-754 標準處理無法預料的浮點數結果。

下面我們看例子:
在這裏插入圖片描述

例子也沒什麼好說的,特別像Python的random庫啊,產生隨機數

我們接下來看源碼:

var freeParseFloat = parseFloat;
var nativeMin = Math.min,
    nativeRandom = Math.random;

function random(lower, upper, floating) {
  if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
    upper = floating = undefined;
  }
  if (floating === undefined) {
    if (typeof upper == 'boolean') {
      floating = upper;
      upper = undefined;
    }
    else if (typeof lower == 'boolean') {
      floating = lower;
      lower = undefined;
    }
  }
  if (lower === undefined && upper === undefined) {
    lower = 0;
    upper = 1;
  }
  else {
    lower = toFinite(lower);
    if (upper === undefined) {
      upper = lower;
      lower = 0;
    } else {
      upper = toFinite(upper);
    }
  }
  if (lower > upper) {
    var temp = lower;
    lower = upper;
    upper = temp;
  }
  if (floating || lower % 1 || upper % 1) {
    var rand = nativeRandom();
    return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
  }
  return baseRandom(lower, upper);
}

module.exports = random;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章