es-toolkit/fp multiply 函数详解:在 pipe 管道中实现数值乘法运算
【免费下载链接】es-toolkitA modern JavaScript utility library that's 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit
multiply 是 es-toolkit 函数式编程入口 es-toolkit/fp 提供的一个数据后置(data-last)数学运算符:它接收一个乘数multiplicand,返回一个"把输入值乘以该乘数"的新函数,专门用于与pipe组合或在map等回调场景中使用。读完本文,你将掌握 multiply 的调用方式、参数与返回类型、与 pipe/map 的协作模式,以及它在底层源码中的实现原理与测试覆盖情况。
概述:multiply 解决什么问题
在普通写法中,对一个数做乘法只需要value * multiplicand一个表达式;但当你希望把"乘以固定倍数"这一操作作为管道中的一个步骤、或作为数组映射回调复用时,直接写(v) => v * 3这样的匿名函数既重复又难以组合。multiply 把这个模式封装为一个工厂函数:
const result = pipe(value, multiply(multiplicand));该 helper 是es-toolkit/fp专有的,其设计目标就是把乘法操作作为pipe管道的一步来组合使用。类似的还有加法版本的 add,两者共同构成了 fp 入口下的基础数学运算工具(见 src/fp/math/index.ts)。
基本用法
multiply 接收multiplicand并返回一个函数,该函数将其输入乘以multiplicand。它专为组合而设计:既可以转换流过pipe的值,也可以作为map等函数的回调。
import { map, multiply, pipe } from 'es-toolkit/fp'; // 转换管道中流过的值。 pipe(3, multiply(2)); // => 6 // 作为 map 的回调使用。 pipe([1, 2, 3], map(multiply(3))); // => [3, 6, 9]参数
multiplicand(number):乘以输入的数值。
返回值
(value: number) => number:将value映射为value * multiplicand的函数。
在 pipe 管道中组合使用
pipe是es-toolkit/fp的入口点,它把value从左到右依次穿过每个函数,前一个函数的输出作为后一个函数的输入(见 src/fp/pipe.ts 的实现)。multiply 作为"已配置、等待数据"的函数,天然适配这种数据流:
import { multiply, pipe } from 'es-toolkit/fp'; // 多个数学步骤串联:先翻倍,再乘以 5。 pipe(3, multiply(2), multiply(5)); // => 30从源码结构看,fp 家族函数的统一约定是"先传配置、后传数据":每个函数先用配置调用(如multiply(2)),返回一个等待数据的一元函数,再由pipe提供数据。multiply 的实现忠实遵循了这一约定——src/fp/math/multiply.ts 的完整实现只有寥寥数行:
export function multiply(multiplicand: number): (value: number) => number { return function (value: number): number { return value * multiplicand; }; }闭包捕获multiplicand,返回的函数在每次调用时计算value * multiplicand。这个返回值就是一个纯函数,因此它既可以直接进pipe,也可以被map逐元素调用。
作为 map 回调使用
multiply 返回值是一元函数,因此可以直接作为map的映射回调,省去(x) => x * 3的匿名函数样板代码:
import { map, multiply, pipe } from 'es-toolkit/fp'; pipe([1, 2, 3], map(multiply(3))); // => [3, 6, 9] pipe([10, 20, 30], map(multiply(0.1))); // => [1, 2, 3]当map这类支持惰性(lazy)的连续步骤出现在同一管道中时,pipe会将它们融合为单趟遍历:每个元素一次性穿过所有步骤,步骤之间不构建中间数组(详见 src/fp/pipe.ts 与 src/fp/pipe.ts 的lazyPipe实现)。multiply 本身是纯数值变换,不涉及迭代控制,因此在融合管道中它作为普通一元函数被逐个元素应用。
边界情况与测试验证
multiply 的单元测试位于 src/fp/math/multiply.spec.ts,使用 Vitest 编写,覆盖了四个关键场景:
| 测试用例 | 输入 | 期望输出 | 说明 |
|---|---|---|---|
| 管道值乘以乘数 | pipe(3, multiply(2)) | 6 | 核心用法,验证与 pipe 的组合 |
| 作为 map 回调 | pipe([1, 2, 3], map(multiply(3))) | [3, 6, 9] | 验证回调场景 |
| 乘以零 | pipe(42, multiply(0)) | 0 | 边界值 |
| 负乘数 | pipe(5, multiply(-2)) | -10 | 符号处理 |
测试直接以multiply(0)和multiply(-2)验证了零值与负数的行为,说明该工具对任意number类型的乘数均按原生 JavaScript 乘法语义处理,无需额外校验。
小结
multiply 是es-toolkit/fp中最基础的数学运算符之一,核心价值在于把"乘以固定倍数"封装成可组合的一元函数。掌握它的要点有三:其一,它只接收multiplicand一个参数并返回(value: number) => number的函数;其二,它必须配合pipe或作为map回调才能体现组合价值;其三,从 src/fp/math/multiply.ts 可见其实现极简,行为与原生*运算符完全一致。若需要了解更多 fp 风格的操作符,可继续阅读 docs/fp/reference 下的pipe、map、add等文档。
【免费下载链接】es-toolkitA modern JavaScript utility library that's 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考