lodash源码乱读-drop后的故事(toInteger,toFinite)

toFinite

语法数组

_.toFinite(value)

转换 value 为一个有限数字。code

源码rem

import toNumber from './toNumber.js';

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
    MAX_INTEGER = 1.7976931348623157e+308;

/**
 * Converts `value` to a finite number.
 *
 * @static
 * @memberOf _
 * @since 4.12.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted number.
 * @example
 *
 * _.toFinite(3.2);
 * // => 3.2
 *
 * _.toFinite(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toFinite(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toFinite('3.2');
 * // => 3.2
 */
function toFinite(value) {
  if (!value) {
    return value === 0 ? value : 0;
  }
  value = toNumber(value);
  if (value === INFINITY || value === -INFINITY) {
    var sign = (value < 0 ? -1 : 1);
    return sign * MAX_INTEGER;
  }
  return value === value ? value : 0;
}

toFinite方法的的做用是转成有限的数字。至于无限是什么,无穷就是无限。源码

var INFINITY = 1 / 0, //Infinity
    MAX_INTEGER = 1.7976931348623157e+308; //

MAX_INTEGER这个值能够经过Number.MAX_VALUE获取到,大于MAX_INTEGER表明Infinityit

明确了这两点,toFinite就很简答了io

function toFinite(value) {
  if (!value) {
    return value === 0 ? value : 0; // 不传value 直接返回0
  }
  value = toNumber(value); //调用tonumber转换成number类型
  if (value === INFINITY || value === -INFINITY) { //正无穷或者负无穷 ,设置一个 标记sign,
    var sign = (value < 0 ? -1 : 1); // sign   -1 || 1
    return sign * MAX_INTEGER; // 返回对应的最大值或者最小值。
  }
  return value === value ? value : 0;// 过滤掉NaN
}

总结一下toFinite不会返回NaN ,或者Infinity(无穷),只会返回一个有限的数字。function

_.toFinite(3.2);
// => 3.2
 
_.toFinite(Number.MIN_VALUE);
// => 5e-324
 
_.toFinite(Infinity);
// => 1.7976931348623157e+308
 
_.toFinite('3.2');
// => 3.2

toInteger

转换 value 为一个整数。class

function toInteger(value) {
  var result = toFinite(value),
      remainder = result % 1;

  return result === result ? (remainder ? result - remainder : result) : 0;
}

这个方法的逻辑很简单,先经过toFinite将传入的参数value转换成一个有限的数字。也就是无穷等会转换成一个具体的数字。import

remainder就是判断result是否有小数位。sed

result === result判断是不是NaN,若是是NaN,返回0,

(remainder ? result - remainder : result)

若是remainder存在,则代表小数部分存在,result减去小数组分的值即是整数部分,不然直接返回整数的result

相关文章
相关标签/搜索