当前位置:   article > 正文

lodash源码分析之Number_lodash hex转num

lodash hex转num

一、lodash版本:4.17.5

二、函数:

     1、clamp

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

          2) 作用:返回加紧的数字。

          3) 例子。

  1. const _ = require('lodash');
  2. console.log(_.clamp(10, 1, 20)); // 输出:10
  3. console.log(_.clamp(10, 5, -9)); // 输出:5
  4. console.log(_.clamp(1, 15, 2)); // 输出:15
  5. console.log(_.clamp(1, '', 2)); // 输出:1
  6. console.log(_.clamp(10, '', '')); // 输出:0
  7. console.log(_.clamp(2, '', 1)); // 输出:1
  8. console.log(_.clamp('', 2, 10)); // 输出:1

           4) 源码及解读。

           源码:

  1. function clamp(number, lower, upper) {
  2.   number = +number
  3.   lower = +lower
  4.   upper = +upper
  5.   lower = lower === lower ? lower : 0
  6.   upper = upper === upper ? upper : 0
  7.   if (number === number) {
  8.     number = number <= upper ? number : upper
  9.     number = number >= lower ? number : lower
  10.   }
  11.   return number
  12. }

       解读: 前面三行将number、lower和upper强制转换为数字类型,防止传入不是数字类型。接着判断lower和upper是否为空,如果不为空就是数值本身,不然就置为0。接着将number和upper进行对比,取两者的最小值。接着拿最小值与lower对比,取最大者。

  1. console.log(clamp(-10, -5, 5)); // 输出:5
  2. console.log(clamp('', '', 5)); // 输出:0
  3. console.log(clamp('', 10, 5)); // 输出:10

     2、inRange

           1)定义:inRange(number,   [start = 0],    end)

           2) 作用:判断某个数是否在区间中。如果结尾数没有指定,而起始数指定了,那么起始数将会是0.如果起始数字比结尾数字大,那么将调换大小,以负数来进行对比。

           3) 例子。

  1. const _ = require('lodash');
  2. console.log(_.inRange(3, 2, 4)); // 输出:true
  3. console.log(_.inRange(3, 10, 4)); // 输出:false
  4. console.log(_.inRange(2, 4)); // 输出:true
  5. console.log(_.inRange(1, 1)); // 输出:false
  6. console.log(_.inRange('', 1, 4)); // 输出:false
  7. console.log(_.inRange('', 10, 4)); // 输出:false
  8. console.log(_.inRange(4, '', 10)); // 输出:false

           4) 源码解析。

           源码:

  1. function inRange(number, start, end) {
  2.   if (end === undefined) {
  3.     end = start
  4.     start = 0
  5.   }
  6.   return baseInRange(+number, +start, +end)
  7. }
  8. function baseInRange(number, start, end) {
  9.   return number >= Math.min(start, end) && number < Math.max(start, end)
  10. }

          解读:在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)  例子。

  1. const _ = require('lodash');
  2. console.log(_.random(0, 10)); // 输出:0
  3. console.log(_.random(0.1, 1)); // 输出:0.9526370972902614
  4. console.log(_.random(0.1, 1.2)); // 输出:1.0932071628590456
  5. console.log(_.random(1, 10, 2.1)); // 输出:4.432399748336776
  6. console.log(_.random(1, true)); // 输出:0.5950723974122696
  7. console.log(_.random(5)); // 输出:3

          4)源码解析。

          源码:

  1. function random(lower, upper, floating) {
  2.   if (floating === undefined) {
  3.     if (typeof upper == 'boolean') {
  4.       floating = upper
  5.       upper = undefined
  6.     }
  7.     else if (typeof lower == 'boolean') {
  8.       floating = lower
  9.       lower = undefined
  10.     }
  11.   }
  12.   if (lower === undefined && upper === undefined) {
  13.     lower = 0
  14.     upper = 1
  15.   }
  16.   else {
  17.     lower = toFinite(lower)
  18.     if (upper === undefined) {
  19.       upper = lower
  20.       lower = 0
  21.     } else {
  22.       upper = toFinite(upper)
  23.     }
  24.   }
  25.   if (lower > upper) {
  26.     const temp = lower
  27.     lower = upper
  28.     upper = temp
  29.   }
  30.   if (floating || lower % 1 || upper % 1) {
  31.     const rand = Math.random()
  32.     const randLength = `${rand}`.length - 1
  33.     return Math.min(lower + (rand * (upper - lower + freeParseFloat(`1e-${randLength}`)), upper))
  34.   }
  35.   return lower + Math.floor(Math.random() * (upper - lower + 1))
  36. }
  37. function toFinite(value) {
  38.   if (!value) {
  39.     return value === 0 ? value : 0
  40.   }
  41.   value = toNumber(value)
  42.   if (value === INFINITY || value === -INFINITY) {
  43.     const sign = (value < 0 ? -1 : 1)
  44.     return sign * MAX_INTEGER
  45.   }
  46.   return value === value ? value : 0
  47. }
  48. function toNumber(value) {
  49.   if (typeof value == 'number') {
  50.     return value
  51.   }
  52.   if (isSymbol(value)) {
  53.     return NAN
  54.   }
  55.   if (isObject(value)) {
  56.     const other = typeof value.valueOf == 'function' ? value.valueOf() : value
  57.     value = isObject(other) ? `${other}` : other
  58.   }
  59.   if (typeof value != 'string') {
  60.     return value === 0 ? value : +value
  61.   }
  62.   value = value.replace(reTrim, '')
  63.   const isBinary = reIsBinary.test(value)
  64.   return (isBinary || reIsOctal.test(value))
  65.     ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
  66.     : (reIsBadHex.test(value) ? NAN : +value)
  67. }
  68. function toNumber(value) {
  69.   if (typeof value == 'number') {
  70.     return value
  71.   }
  72.   if (isSymbol(value)) {
  73.     return NAN
  74.   }
  75.   if (isObject(value)) {
  76.     const other = typeof value.valueOf == 'function' ? value.valueOf() : value
  77.     value = isObject(other) ? `${other}` : other
  78.   }
  79.   if (typeof value != 'string') {
  80.     return value === 0 ? value : +value
  81.   }
  82.   value = value.replace(reTrim, '')
  83.   const isBinary = reIsBinary.test(value)
  84.   return (isBinary || reIsOctal.test(value))
  85.     ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
  86.     : (reIsBadHex.test(value) ? NAN : +value)
  87. }

      解读:

      1)首先的if判断floating是否为空,如果为空接着判断最大值和最小值是否为布尔类型。如果有一方为布尔值,那么将该布尔值赋值给floating,然后将lower或者upper置为空。

      2)第二个if表达式判断lower和upper是否同时为空,如果同时为空,就置为0和1;

      3)如果lower或者upper又一个不为空,那么将判断最小是否为有限数。如果不是有限数,将其转换为有限数,否则保留数值本身。

      4)接着判断upper的值,代码如下:

  1. if (upper === undefined) {
  2.   upper = lower
  3.   lower = 0
  4. } else {
  5.   upper = toFinite(upper)
  6. }

      如果upper为空,那么将lower设置为upper,然后lower设置为0.否则判断upper是否为有限数。

      5)然后判断lower是否大于upper,如果是,则调换双方的数值。代码如下所示:

  1. if (lower > upper) {
  2.   const temp = lower
  3.   lower = upper
  4.   upper = temp
  5. }

      6)如果floating存在或者lower大于1或者upper大于1,那么产生随时数。

      7)否则利用lower产生随机数。代码如下所示。

  1. if (floating || lower % 1 || upper % 1) {
  2.   const rand = Math.random()
  3.   const randLength = `${rand}`.length - 1
  4.   return Math.min(lower + (rand * (upper - lower + freeParseFloat(`1e-${randLength}`)), upper))
  5. }
  6. return lower + Math.floor(Math.random() * (upper - lower + 1))

欢迎纠错,共同进步。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/818153
推荐阅读
相关标签
  

闽ICP备14008679号