lodash原始碼分析之Number

2021-08-21 21:17:33 字數 4679 閱讀 1097

一、lodash版本:4.17.5

二、函式:

1、clamp

1)定義:clamp(number,   [lower],    upper)

2) 作用:返回加緊的數字。

3) 例子。

const _ = require('lodash');

console.log(_.clamp(10, 1, 20)); // 輸出:10

console.log(_.clamp(10, 5, -9)); // 輸出:5

console.log(_.clamp(1, 15, 2)); // 輸出:15

console.log(_.clamp(1, '', 2)); // 輸出:1

console.log(_.clamp(10, '', '')); // 輸出:0

console.log(_.clamp(2, '', 1)); // 輸出:1

console.log(_.clamp('', 2, 10)); // 輸出:1

4) 原始碼及解讀。

原始碼:

function clamp(number, lower, upper) 

return number

}

解讀: 前面三行將number、lower和upper強制轉換為數字型別,防止傳入不是數字型別。接著判斷lower和upper是否為空,如果不為空就是數值本身,不然就置為0。接著將number和upper進行對比,取兩者的最小值。接著拿最小值與lower對比,取最大者。

console.log(clamp(-10, -5, 5)); // 輸出:5

console.log(clamp('', '', 5)); // 輸出:0

console.log(clamp('', 10, 5)); // 輸出:10

2、inrange

1)定義:inrange(number,   [start = 0],    end)

2) 作用:判斷某個數是否在區間中。如果結尾數沒有指定,而起始數指定了,那麼起始數將會是0.如果起始數字比結尾數字大,那麼將調換大小,以負數來進行對比。

3) 例子。

const _ = require('lodash');

console.log(_.inrange(3, 2, 4)); // 輸出:true

console.log(_.inrange(3, 10, 4)); // 輸出:false

console.log(_.inrange(2, 4)); // 輸出:true

console.log(_.inrange(1, 1)); // 輸出:false

console.log(_.inrange('', 1, 4)); // 輸出:false

console.log(_.inrange('', 10, 4)); // 輸出:false

console.log(_.inrange(4, '', 10)); // 輸出:false

4) 原始碼解析。

原始碼:

function inrange(number, start, end) 

return baseinrange(+number, +start, +end)

}function baseinrange(number, start, end)

解讀:在inrange中,第乙個if語句中,如果end是空,那麼end值設定為start值,start設定為0。例如:

console.log(inrange(3, 2, 4)); // 輸出:true
接著呼叫baseinrange函式,接著判斷numer是否是start和end之間的數值。如果是,將返回true,否則返回false。例如:

console.log(inrange(3, 2, 4)); // 輸出:true
3、random

1)定義:random([lower=0],   [upper= 1],    [floating])

2)  作用:產生乙個隨機數。

3)  例子。

const _ = require('lodash');

console.log(_.random(0, 10)); // 輸出:0

console.log(_.random(0.1, 1)); // 輸出:0.9526370972902614

console.log(_.random(0.1, 1.2)); // 輸出:1.0932071628590456

console.log(_.random(1, 10, 2.1)); // 輸出:4.432399748336776

console.log(_.random(1, true)); // 輸出:0.5950723974122696

console.log(_.random(5)); // 輸出:3

4)原始碼解析。

原始碼:

function random(lower, upper, floating) 

else if (typeof lower == 'boolean')

}  if (lower === undefined && upper === undefined)

else else

}  if (lower > upper)

if (floating || lower % 1 || upper % 1) `.length - 1

return math.min(lower + (rand * (upper - lower + freeparsefloat(`1e-$`)), upper))

}  return lower + math.floor(math.random() * (upper - lower + 1))

}function tofinite(value)

value = tonumber(value)

if (value === infinity || value === -infinity)

return value === value ? value : 0

}function tonumber(value)

if (issymbol(value))

if (isobject(value)) ` : other

}  if (typeof value != 'string')

value = value.replace(retrim, '')

const isbinary = reisbinary.test(value)

return (isbinary || reisoctal.test(value))

? freeparseint(value.slice(2), isbinary ? 2 : 8)

: (reisbadhex.test(value) ? nan : +value)

}function tonumber(value)

if (issymbol(value))

if (isobject(value)) ` : other

}  if (typeof value != 'string')

value = value.replace(retrim, '')

const isbinary = reisbinary.test(value)

return (isbinary || reisoctal.test(value))

? freeparseint(value.slice(2), isbinary ? 2 : 8)

: (reisbadhex.test(value) ? nan : +value)

}

解讀:

1)首先的if判斷floating是否為空,如果為空接著判斷最大值和最小值是否為布林型別。如果有一方為布林值,那麼將該布林值賦值給floating,然後將lower或者upper置為空。

2)第二個if表示式判斷lower和upper是否同時為空,如果同時為空,就置為0和1;

3)如果lower或者upper又乙個不為空,那麼將判斷最小是否為有限數。如果不是有限數,將其轉換為有限數,否則保留數值本身。

4)接著判斷upper的值,**如下:

if (upper === undefined)  else
如果upper為空,那麼將lower設定為upper,然後lower設定為0.否則判斷upper是否為有限數。

5)然後判斷lower是否大於upper,如果是,則調換雙方的數值。**如下所示:

if (lower > upper)
6)如果floating存在或者lower大於1或者upper大於1,那麼產生隨時數。

7)否則利用lower產生隨機數。**如下所示。

if (floating || lower % 1 || upper % 1) `.length - 1

return math.min(lower + (rand * (upper - lower + freeparsefloat(`1e-$`)), upper))

}return lower + math.floor(math.random() * (upper - lower + 1))

歡迎糾錯,共同進步。

lodash原始碼分析之isArguments

有人命中註定要過平庸的生活,默默無聞,因為他們經歷了痛苦或不幸 有人卻故意這樣做,那是因為他們得到的幸福超過了他們的承受能力。卡爾維諾 煙雲 本文為讀 lodash 原始碼的第二十一篇,後續文章會更新到這個倉庫中,歡迎 star pocket lodash import gettag from in...

lodash原始碼分析之List快取

昨日我沿著河岸 漫步到 蘆葦彎腰喝水的地方 順便請煙囪 在天空為我寫一封長長的信 潦是潦草了些 而我的心意 則明亮亦如你窗前的燭光 稍有曖昧之處 勢所難免 因為風的緣故 洛夫 因為風的緣故 本文為讀 lodash 原始碼的第七篇,後續文章會更新到這個倉庫中,歡迎 star pocket lodash...

lodash原始碼分析之快取方式的選擇

每個人心裡都有一團火,路過的人只看到煙。至愛梵谷 星空之謎 本文為讀 lodash 原始碼的第八篇,後續文章會更新到這個倉庫中,歡迎 star pocket lodash 在 lodash原始碼分析之hash快取 和 lodash原始碼分析之list快取 介紹了 lodash 的兩種快取方式,這兩種...