Lodash源码阅读-isSafeInteger

功能概述

isSafeInteger 函数是 Lodash 中用于判断一个值是否为安全整数的工具函数。所谓安全整数,就是指在 JavaScript 中可以精确表示且不会失去精度的整数,它的范围是从 -(2^53 - 1) 到 2^53 - 1 之间的整数。

源码实现

js 复制代码
function isSafeInteger(value) {
  return (
    isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER
  );
}

实现原理解析

整体思路

isSafeInteger 函数采用了一个三重检查的策略:首先确保值是整数,然后验证这个整数是否在安全范围内。这种实现方式既简单又可靠,能够准确识别出 JavaScript 中可以安全使用的整数值。

让我们详细分析每个判断条件:

1. isInteger(value) 检查

首先使用 isInteger 函数判断值是否为整数。这个检查可以过滤掉:

  • 非数字类型的值
  • 小数
  • NaN
  • Infinity/-Infinity
js 复制代码
isSafeInteger(3.14); // false(小数)
isSafeInteger("123"); // false(字符串)
isSafeInteger(NaN); // false(NaN)
isSafeInteger(Infinity); // false(无穷大)

2. value >= -MAX_SAFE_INTEGER 检查

确保数值不小于最小安全整数。JavaScript 中的 MAX_SAFE_INTEGER 是 2^53 - 1,所以最小安全整数是它的负值。

js 复制代码
isSafeInteger(-9007199254740991); // true(最小安全整数)
isSafeInteger(-9007199254740992); // false(超出最小安全范围)
isSafeInteger(Number.MIN_SAFE_INTEGER); // true(同最小安全整数)

3. value <= MAX_SAFE_INTEGER 检查

确保数值不大于最大安全整数。这个检查可以过滤掉那些虽然是整数,但已经超出了 JavaScript 能够精确表示的范围的数值。

js 复制代码
isSafeInteger(9007199254740991); // true(最大安全整数)
isSafeInteger(9007199254740992); // false(超出最大安全范围)
isSafeInteger(Number.MAX_SAFE_INTEGER); // true(同最大安全整数)

总结

isSafeInteger 函数通过组合整数检查和范围验证,提供了一个可靠的方式来判断一个数值是否为安全整数。它的实现简单直观,但却能有效地帮助我们避免在处理大数时可能出现的精度问题。

相关推荐
里欧跑得慢11 分钟前
Flutter 三方库 function_tree — 鸿蒙应用开发中的动态数学公式解析与计算神器,实现鸿蒙深度适配下的复杂函数逻辑运行时求值实战(适配鸿蒙 HarmonyOS Next ohos)
android·前端·安全·flutter·华为·harmonyos
苏灿烤鱼37 分钟前
没有机密文件,也没有付费数据,在浏览器里造一颗"间谍卫星"
前端·javascript·github
泯泷1 小时前
手搓JSVM第 5 篇:写第一个编译器:从 AST 生成 IR
前端·javascript·算法
泯泷1 小时前
手搓JSVM第 7 篇:控制流:if、while 与 jump
前端·javascript·算法
泯泷1 小时前
手搓JSVM第 6 篇:把 IR 编成字节码:emit 与 label fixup
前端·javascript·算法
泯泷1 小时前
手搓JSVM第 3 篇:从栈式 VM 到寄存器式 VM:为什么我们选择寄存器
前端·javascript·算法
泯泷1 小时前
第 4 篇:让 VM 支持变量:Slot、Environment 与 TDZ
前端·javascript·算法
粥里有勺糖3 小时前
视野修炼-技术周刊第131期 | Bun 与 pnpm Rust 化
前端·github·agent
Coodor3 小时前
如何在web浏览器使用js操作CPU卡
开发语言·前端·javascript·cpu卡