es-toolkit 的 inRange 函数:数值范围判定、边界语义与源码级实现解析 es-toolkit 的 inRange 函数数值范围判定、边界语义与源码级实现解析【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit导读inRange是 es-toolkit 数学模块中用于判断一个数值是否落在指定闭开区间内的工具函数支持[0, maximum)与[minimum, maximum)两种调用形式覆盖 number 与 bigint 两种类型并提供了与 lodash 行为兼容的版本。读完本文你将掌握inRange的完整用法、左闭右开边界语义、非法范围的报错规则以及其源码实现与测试用例背后的设计细节可直接用于分数校验、分页边界判定等实际场景。函数定位与两种调用形式inRange用于检查一个值是否处于指定的数值范围内。与直觉略有不同的是它遵循数学上常见的左闭右开约定下界包含、上界不包含。es-toolkit 为其设计了两种重载调用形式// 形式一只传上限下界自动为 0 const result inRange(value, maximum); // 形式二显式指定下界与上限 const result inRange(value, minimum, maximum);两种形式对应的完整重载声明定义在 src/math/inRange.ts 中从源码结构看es-toolkit 通过 TypeScript 函数重载为两种调用方式分别提供了精确的类型签名。inRange已通过 src/math/index.ts 从es-toolkit/math子路径导出因此可以按如下方式引入import { inRange } from es-toolkit/math;形式一inRange(value, maximum)— 检查 0 到上限之间的值当你只需要判断某个值是否大于等于 0 且小于某个上限时使用单参数形式此时最小值自动取 0。import { inRange } from es-toolkit/math; // 检查是否处于 0 到 5不含之间 const result1 inRange(3, 5); // result1 为 true (0 3 5) const result2 inRange(5, 5); // result2 为 false (5 不小于 5) const result3 inRange(-1, 5); // result3 为 false (-1 0)参数说明参数类型说明valuenumber需要检查的值maximumnumber范围的上限不包含返回值返回boolean当值处于0 value maximum区间内时返回true否则返回false。形式二inRange(value, minimum, maximum)— 检查指定区间内的值当你需要显式控制下界时使用三参数形式判定条件为minimum value maximum。import { inRange } from es-toolkit/math; // 在最小值和最大值之间检查 const result1 inRange(3, 2, 5); // result1 为 true (2 3 5) const result2 inRange(1, 2, 5); // result2 为 false (1 2) const result3 inRange(5, 2, 5); // result3 为 false (5 不小于 5) // 负数范围同样适用 const result4 inRange(-3, -5, -1); // result4 为 true (-5 -3 -1)参数说明参数类型说明valuenumber需要检查的值minimumnumber范围的下限包含maximumnumber范围的上限不包含返回值返回boolean当值处于minimum value maximum区间内时返回true否则返回false。错误情况当minimum大于等于maximum时inRange会抛出Error而不是静默返回false这能帮助调用方及早发现参数颠倒等逻辑错误。左闭右开的边界语义理解inRange的核心在于记住它的区间约定是[minimum, maximum)下界包含inRange(3, 3, 5)为true等于下界的值会被判定为在范围内上界不包含inRange(5, 2, 5)为false等于上界的值会被判定为超出范围0 下界特例在双参数形式中inRange(0, 5)为true因为默认下界 0 本身包含在区间内。这一语义在 src/math/inRange.spec.ts 的测试中有完整覆盖例如inRange(3, 5)、inRange(3.2, 5.3)返回true而inRange(3, 2)、inRange(5.3, 3.2)返回false。值得注意的是该测试同时验证了小数同样适用——inRange并不要求整数这与clamp、randomInt等函数形成互补需要整数范围随机数时可配合 randomInt 使用。源码级实现解析inRange的完整实现位于 src/math/inRange.ts逻辑非常精炼export function inRange(value: number, minimum: number, maximum?: number): boolean { if (maximum null) { maximum minimum; minimum 0; } if (minimum maximum) { throw new Error(The maximum value must be greater than the minimum value.); } return minimum value value maximum; }实现要点可以归纳为三点参数归一当maximum为空即只传入两个参数时把原来的minimum参数视为上限并将下界重置为0从而统一进入[minimum, maximum)的判定路径非法范围校验在比较之前先检查minimum maximum一旦成立立即抛出Error。该错误消息在 src/math/inRange.spec.ts 中以快照inline snapshot形式被断言为The maximum value must be greater than the minimum value.一次比较完成判定核心逻辑仅一行minimum value value maximum利用短路求值性能开销极低——这也契合 es-toolkit 作为现代 JavaScript 工具库小而快的设计目标。扩展一bigint 版本支持大整数精确判定对于超过Number.MAX_SAFE_INTEGER的整数es-toolkit 还提供了 bigint 版本的inRange位于 src/bigint/inRange.ts并从 src/bigint/index.ts 导出import { inRange } from es-toolkit/bigint; inRange(3n, 5n); // true等价于 [0n, 5n) 区间 inRange(5n, 0n, 10n); // true inRange(10n, 0n, 10n); // false上界不包含bigint 版本与 number 版本共享完全相同的语义双参数时下界默认0n、区间左闭右开、minimum maximum时抛出同样的错误消息。其特殊价值在于超出安全整数范围后的精确性——src/bigint/inRange.spec.ts 专门验证了inRange(9007199254740993n, 0n, 9007199254740994n)返回true这类数值用number表示时精度已经受损只有 bigint 才能给出准确判定。扩展二compat 版本lodash 兼容行为如果你在从 lodash 迁移es-toolkit 的兼容模块中还提供了行为对齐 lodash 的inRange位于 src/compat/math/inRange.ts并通过 src/compat/compat.ts 导出。与标准版本最大的差异在于边界处理策略lodash 语义下当传入的minimum与maximum顺序颠倒时不会抛错而是自动交换使较小的值成为包含的下界、较大的值成为不包含的上界// compat 版本顺序颠倒时自动交换不抛错 return value Math.min(minimum, maximum) value Math.max(minimum, maximum);同时compat 版本内部会通过toFinite与toNumber对入参做隐式转换见 src/compat/util/toFinite.ts 与 src/compat/util/toNumber.ts与 lodash 的宽松入参行为保持一致。如果你的业务要求严格的[min, max)顺序校验应使用标准版的es-toolkit/math如果追求与 lodash 的无缝替换则应使用es-toolkit/compat。典型应用场景结合inRange的边界语义以下是几个贴合实际的用法import { inRange } from es-toolkit/math; // 表单分数校验0 到 100不含之间 function isValidScore(score: number): boolean { return inRange(score, 0, 100); } // 分页边界判定页码从 1 开始最大 10 页 function isValidPage(page: number): boolean { return inRange(page, 1, 11); } // 进度条百分比含 0 不含 100 function isProgressIncomplete(percent: number): boolean { return inRange(percent, 0, 100); }当业务要求包含上限时只需把上限加 1 或改用比较即可在保持语义清晰的同时复用inRange。小结维度说明区间语义左闭右开[minimum, maximum)下界包含、上界不包含双参数形式inRange(value, maximum)等价于检查[0, maximum)三参数形式inRange(value, minimum, maximum)检查[minimum, maximum)非法范围minimum maximum时抛出Error类型支持numbersrc/math/inRange.ts与bigintsrc/bigint/inRange.tslodash 兼容src/compat/math/inRange.ts 提供顺序颠倒自动交换的兼容行为测试覆盖src/math/inRange.spec.ts 与 src/bigint/inRange.spec.tsinRange虽小却把范围判定这一高频需求以精确的边界语义、完整的类型覆盖和兼容策略封装成了一个开箱即用的函数。理解它的左闭右开约定与两种形式的参数归一逻辑是正确使用它的关键而当迁移自 lodash 时请记得选择es-toolkit/compat版本以获得一致的入参处理行为。【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考