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

相關文章
相關標籤/搜索