ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

es-toolkit/compat 的 sum 函数:Lodash 兼容求和与迁移到现代 API 的完整指南

es-toolkit/compat 的 sum 函数:Lodash 兼容求和与迁移到现代 API 的完整指南 es-toolkit/compat 的 sum 函数Lodash 兼容求和与迁移到现代 API 的完整指南【免费下载链接】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导读本文围绕es-toolkit/compat提供的sum函数展开它用于对数组中的全部数值求和并保持与 Lodash_.sum1:1 的行为兼容。对于正在将 Lodash 代码库迁移到 es-toolkit 的开发者本文会讲清 compat 版sum的调用方式、BigInt 与字符串等特殊类型的处理规则、无效值忽略策略并结合源码解释其底层实现为何比现代版更慢最后给出从es-toolkit/compat平滑切换到现代es-toolkit/mathAPI 的迁移路线。compat 版 sum 是什么es-toolkit/compat是 es-toolkit 的 Lodash 兼容层目标是以 1:1 的方式镜像 Lodash 的接口与行为让你可以把既有 Lodash 代码库直接切换到 es-toolkit 而无需修改调用点参见 compat 介绍。本页面的sum就是该兼容层中与 Lodash_.sum对应的实现声明于 src/compat/math/sum.ts。函数签名非常简单const total sum(array);arrayArrayLikeany | null | undefined包含待求和值的类数组对象。返回值number所有值的总和。基础用法数值数组求和通过import { sum } from es-toolkit/compat;引入后即可对数字数组求和import { sum } from es-toolkit/compat; // Number array sum([1, 2, 3]); // Returns: 6 sum([1.5, 2.5, 3]); // Returns: 7 // Empty array sum([]); // Returns: 0BigInt 与字符串与严格类型化的现代 API 不同compat 版sum还处理 BigInt 与字符串。注意字符串不会被强制转换为数字而是按运算符的语义进行拼接import { sum } from es-toolkit/compat; // BigInt array sum([1n, 2n, 3n]); // Returns: 6n // String array (concatenated) sum([1, 2]); // Returns: 12无效值被忽略null、undefined以及稀疏数组中的空位会被跳过不会污染求和结果import { sum } from es-toolkit/compat; sum([1, undefined, 2]); // Returns: 3 (undefined ignored) sum(null); // Returns: 0 sum(undefined); // Returns: 0源码级原理为什么 compat 版更慢原文档明确指出这个 compat 版sum因类型转换与 null/undefined 处理而运行较慢。查看 src/compat/math/sum.ts 可以看到compat 版sum只是一个薄封装把所有逻辑委托给了sumByexport function sum(array: ArrayLikeany | null | undefined): number { return sumBy(array); }而真正的实现在 src/compat/math/sumBy.ts其核心逻辑如下先做空值/空数组短路if (!array || !array.length) return 0;用let result: any undefined;保存累加结果首个有效值直接赋值后续值通过result current累加累加前逐项检查current ! undefined从而跳过undefined元素。这套逻辑带来的行为特征包括不做类型强制转换累加直接使用 JS 的运算符所以字符串数组结果是拼接12BigInt 数组结果是6n。跳过 undefined 但保留 NaNsum([1, NaN])返回NaN因为NaN ! undefined为真NaN会参与累加。支持ArrayLike输入类型签名是ArrayLikeany因此类数组对象如带length与索引属性的对象也能求和。与之相对现代版sum位于 src/math/sum.ts是一个纯粹的 for 循环类型被严格限定为readonly number[]export function sum(nums: readonly number[]): number { let result 0; for (let i 0; i nums.length; i) { result nums[i]; } return result; }对比可见现代版没有ArrayLike归一化、没有逐元素undefined判断、没有iteratee委托因此运行时开销更小compat 版为对齐 Lodash 行为付出的额外逻辑正是其更慢的根源。测试用例佐证compat 版sum的行为由 src/compat/math/sum.spec.ts 完整覆盖测试确认了以下契约数值数组正确求和sum([6, 4, 2])为12传入空值来自empties测试夹具时一律返回0跳过undefinedsum([undefined, 1, 2, 3])为6不跳过NaNsum([1, NaN])为NaN不强制类型转换sum([1, 2])为12。sumBy的测试 src/compat/math/sumBy.spec.ts 还额外验证了 iteratee 与属性简写形式sumBy(objects, a)。现代版sum的测试见 src/math/sum.spec.ts覆盖普通求和、空数组返回0、负数混合求和以及两段数组之和等于拼接后数组之和的可结合性。迁移建议改用 es-toolkit 的现代 sum原文档给出明确建议优先使用es-toolkit提供的更快、更现代的sum即 docs/reference/math/sum.md 中介绍的版本。import { sum } from es-toolkit/math; const numbers [1, 2, 3, 4, 5]; const total sum(numbers); console.log(total); // 15现代版适用场景包括小数求和sum([19.99, 25.5, 3.75])→49.24正负数混合sum([-10, 5, -3, 8])→0空数组返回0可与round等其他数学函数组合使用例如先求和再保留两位小数。迁移边界如果你需要的是 compat 版特有的行为——BigInt 求和、字符串拼接语义、类数组输入、null/undefined宽容处理——则必须继续使用es-toolkit/compat的sum现代版严格限定为number[]不会做这些特殊处理。推荐路径是先用es-toolkit/compat平滑替换 Lodash再逐步将调用点清理为类型安全的现代 API迁移流程详见 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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进