Lodash源码阅读-toInteger

140 阅读1分钟

功能概述

toInteger 函数是一个实用的类型转换工具,它可以将各种类型的值转换为整数。不管你传入什么类型的值(数字、字符串、对象等),它都会尽量将其转换为一个整数值,如果无法转换,就会返回 0。

源码实现

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

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

实现原理解析

整体思路

toInteger 函数采用了一个简单但巧妙的策略,通过两个主要步骤来确保输出一个整数:

  1. 有限值转换:使用 toFinite 函数将输入值转换为有限数值
  2. 整数化处理:通过取余和减法运算去除小数部分

让我们详细看看每个步骤:

1. 有限值转换

var result = toFinite(value);

首先使用 toFinite 函数将输入值转换为有限数值:

_.toInteger(3.2); // => 3
_.toInteger("3.2"); // => 3
_.toInteger("0xff"); // => 255
_.toInteger(Infinity); // => 1.7976931348623157e+308
_.toInteger(-Infinity); // => -1.7976931348623157e+308

2. 小数处理

var remainder = result % 1;

计算数值与 1 的取余,用于判断是否存在小数部分:

_.toInteger(3.2); // remainder = 0.2
_.toInteger(4.0); // remainder = 0
_.toInteger(-3.2); // remainder = -0.2

3. 结果处理

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

最后的处理逻辑分为两部分:

  1. 首先通过 result === result 判断是否为 NaN:
_.toInteger(NaN); // => 0
_.toInteger("abc"); // => 0
  1. 如果不是 NaN,则根据是否有小数部分决定返回值:
_.toInteger(3.2); // => 3(有小数,减去remainder)
_.toInteger(4.0); // => 4(无小数,直接返回)
_.toInteger(-3.2); // => -3(有小数,减去remainder)

总结

toInteger 函数通过巧妙地结合 toFinite 转换和取余运算,实现了将各种类型的值转换为整数的功能。它的实现考虑了各种边界情况,包括小数、NaN、无穷值等特殊情况,使其在实际应用中具有很强的实用性。