深入理解 JavaScript 函数元数(Function Arity):从 length 到柯里化与变参转换
教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载函数元数arity指一个函数期望接收的参数个数。这个概念看似理论但在函数式编程中极为实用——它是柯里化、部分应用、函数组合等核心技巧的基础。读完本文你将掌握如何用Function.prototype.length获取函数元数、如何构造固定元数nullary/unary/binary/n-ary的函数以及如何在数组接收函数与变参函数之间自由转换从而写出更灵活、更易复用的代码。一、什么是函数元数函数元数arity是函数期望接收的参数个数。在 JavaScript 中这个概念听起来很理论化但在实际编程中非常有用尤其是在函数式编程领域。一元函数unary接收恰好 1 个参数二元函数binary接收恰好 2 个参数n 元函数n-ary接收恰好 n 个参数零元函数nullary接收0 个参数变参函数variadic接收可变数量的参数。从仓库的 函数式编程集合 可以看出元数概念与 柯里化currying、函数部分应用partial application、函数组合function composition 共同构成了该集合的核心知识链。这些技巧都依赖知道一个函数接收多少参数这一前提。二、获取函数的元数Function.prototype.length获取函数元数最直接的方式就是读取Function.prototype.length属性const arity fn fn.length; arity(Math.sqrt); // 1 arity(Math.pow); // 2 arity((x, y, z) x y z); // 3 arity((...args) args); // 0从上面的例子可以看出普通函数的length属性值就是其声明的形参个数。但需要注意Function.prototype.length统计的是函数声明的形参数量与调用时实际传入的参数无关**变参函数variadic function**的length为0。所谓变参函数是指可以接收可变数量参数的函数典型如使用 rest 参数...args定义的函数。length 的更多细节Function.prototype.length在统计时有一些容易被忽略的规则理解它们有助于避免踩坑带有默认值的形参之后的所有参数不计入length。例如(a, b 1, c)的length为1rest 参数...args不计入length这是变参函数length为0的根本原因解构形参不计入length例如({ a, b })的length为0。这些规则与 ECMAScript 规范一致也是后面柯里化实现中需要谨慎处理变参函数的原因。三、创建固定元数的函数有些场景下我们希望限制函数最多接收的参数个数。这对变参函数尤其有用特别是与 柯里化 结合时——柯里化需要精确知道函数何时参数收够了才能调用原始函数。零元函数Nullary零元函数是不接收任何参数的函数。创建方式很简单只需调用原始函数而不传任何参数const nullary fn () fn(); nullary(Math.random)(); // 0.6019623086这里返回的新函数不接受任何参数内部调用fn()时也不传递任何参数。一元函数Unary一元函数是恰好接收一个参数的函数。创建方式为调用原函数时只提供第一个参数const unary fn val fn(val); [6, 8, 10].map(unary(Number.parseInt)); // [6, 8, 10]这个例子很好地展示了元数限制的实战价值Array.prototype.map()会向回调传入(element, index, array)三个参数而Number.parseInt的签名是parseInt(string, radix)——如果直接把Number.parseInt传给map索引值会被误当作进制参数radix导致parseInt(8, 1)这类错误。用unary()包装后map只传入第一个参数问题迎刃而解。二元函数Binary二元函数是恰好接收两个参数的函数。与一元函数类似创建时只提供前两个参数const binary fn (a, b) fn(a, b); [2, 1, 0].map(binary(Math.max)); // [2, 1, 2]这里用binary()包装Math.max后map回调的第三个参数array不再被传入因此输出为[2, 1, 2]分别是max(2,1)、max(1,0)、max(0,2)而不是不可预期的错误结果。n 元函数N-ary推广到一般情况n 元函数是恰好接收 n 个参数的函数。借助Array.prototype.slice()和展开运算符...可以创建一个只把前 n 个参数传给原函数的包装函数const nAry (fn, n) (...args) fn(...args.slice(0, n)); const firstTwoMax nAry(Math.max, 2); [[2, 6, a], [6, 4, 8], [10]].map(x firstTwoMax(...x)); // [6, 6, 10]解析这个实现nAry接收原函数fn和目标元数n返回一个新函数新函数通过 rest 参数...args收集调用时传入的所有参数args.slice(0, n)只保留前 n 个参数再通过展开运算符传给fn示例中firstTwoMax只取前两个参数求最大值因此firstTwoMax(2, 6, a)结果为6firstTwoMax(10)的结果是10只有一个参数时它自己就是最大值输出[6, 6, 10]。四、数组接收函数与变参函数的相互转换有些场景下把接收数组参数的函数转换为变参函数会更方便反之亦然。利用展开运算符...与 rest 参数这种转换非常直接const toVariadic fn (...args) fn(args); const fromVariadic fn args fn(...args); const allPromises toVariadic(Promise.all.bind(Promise)); let p1 Promise.resolve(1); let p2 Promise.resolve(2); allPromises(p1, p2).then(console.log); // LOGS: [1, 2] const arrayMax fromVariadic(Math.max); arrayMax([1, 2, 3]); // 3两个转换函数的原理toVariadic接收一个数组接收函数如Promise.all它期望一个可迭代对象返回一个变参函数。调用时把所有参数收集成数组args再整体传给原函数。示例中Promise.all本身期望接收数组通过toVariadic包装后就可以用allPromises(p1, p2)这种变参风格调用fromVariadic反向转换。接收一个变参函数如Math.max返回一个只接收数组参数的函数。调用时把数组args展开成多个参数传给原函数因此arrayMax([1, 2, 3])等价于Math.max(1, 2, 3)结果为3。注意示例中的细节Promise.all.bind(Promise)确保了Promise.all的this指向正确避免在作为回调传递时丢失上下文。五、元数在柯里化与部分应用中的关键作用元数概念之所以重要核心在于函数式编程的多个技巧都依赖它来数参数。柯里化依赖精确的元数在 柯里化详解 中一个固定元数函数的curry()实现直接使用Function.prototype.length判断何时可以调用原函数const curry (fn) { const curried (...args) ( args.length fn.length ? fn(...args) : (...rest) curried(...args, ...rest) ); return curried; }; const add (x, y) x y; const curriedAdd curry(add); curriedAdd(1)(2); // 3递归地收集参数直到args.length fn.length即收集的参数数量达到函数元数才真正调用原函数。但问题来了变参函数的length为0上述实现会立即调用原函数柯里化失效。该文档指出Math.min的length是 2但这只是弱信号并不能代表用户自定义变参函数的真实意图。解决办法是显式传入期望的元数const curry (fn, arity fn.length, ...args) arity args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); curry(Math.pow)(2)(10); // 1024 curry(Math.min, 3)(10)(50)(2); // 2这里arity参数默认取fn.length对于变参函数则可以手动指定如curry(Math.min, 3)柯里化过程中用arity args.length判断是否收齐参数。部分应用缩小元数的技巧函数部分应用 对元数的描述更加直白部分应用是固定一个函数的一部分参数产生另一个元数更小的函数的技术其实现同样依赖展开运算符收集/展开参数const partial (fn, ...partials) (...args) fn(...partials, ...args);函数组合对元数的约束在 函数组合 中元数约束体现在组合规则上第一个函数可以是任意元数而其余函数必须是一元函数——因为后续函数只能接收前一个函数的单个返回值作为输入。这正是元数概念融入函数式编程体系的具体表现。六、仓库中的实现痕迹旧版片段的合并从 重定向配置 可以看到本仓库曾将多个独立片段合并进function-arity这一篇文档旧路径统一以 301 状态跳转到/js/s/function-arity/js/s/ary、/js/s/unary、/js/s/binary/js/s/unary-function-arity、/js/s/binary-function-arity/js/s/convert-function-to-variadic、/js/s/convert-function-from-variadic/js/s/collect-into、/js/s/spread-over这印证了本文内容是对获取元数、限制元数、变参与数组接收函数互转等一批相关技巧的整合也意味着依赖旧路径的链接依然有效不会被破坏。七、总结与最佳实践围绕元数arity可以提炼出几条实用的编码准则用Function.prototype.length读取普通函数的元数但要牢记默认参数、rest 参数、解构形参不计入length的规则处理变参函数时显式声明元数在柯里化等场景中通过额外的arity参数弥补length为0的缺陷用固定元数包装函数防止多余参数污染unary()包装parseInt传给map是经典陷阱的解法善用toVariadic/fromVariadic切换调用风格让数组接收型 API如Promise.all与变参型 API如Math.max在不同上下文下都能顺手使用。元数虽小却是通往柯里化、部分应用、函数组合等高级函数式编程技巧的钥匙。掌握它你就能在编写高阶函数时更从容地控制参数的流向。赞分享教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载相关推荐深入理解 JavaScript 柯里化从固定参数到变参函数再到反柯里化深入理解 JavaScript 柯里化从固定参数到变参函数再到反柯里化 柯里化Currying是函数式编程中的核心技法它将一个接收多个参数的函数转换为教程文档5大策略实现微服务性能飞跃从瓶颈到极速的实战指南5大策略实现微服务性能飞跃从瓶颈到极速的实战指南 你是否遇到过微服务在高并发场景下响应缓慢、数据库连接池耗尽、缓存穿透导致系统雪崩的困扰go zero作为云后端RPC框架Web框架微服务API网关服务注册发现代码生成Citra 3DS模拟器终极指南在PC上免费畅玩任天堂3DS游戏Citra 3DS模拟器终极指南在PC上免费畅玩任天堂3DS游戏 想要在电脑上重温《精灵宝可梦XY》、《塞尔达传说时之笛3D》等经典3DS游戏吗Citra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

掉电不丢数据:MRAM在工业嵌入式存储中的设计实践

掉电不丢数据:MRAM在工业嵌入式存储中的设计实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 4:01:03 阅读更多 →
DeepSeek大模型赋能电网新能源消纳:分钟级动态接纳能力实现

DeepSeek大模型赋能电网新能源消纳:分钟级动态接纳能力实现

简介:本资源是一份面向电力系统工程师、新能源调度算法研发人员及AI能源交叉领域研究者的深度技术方案,聚焦大模型赋能下的新能源消纳能力提升难题,系统解决电网接纳波动性电源的预测精度低、调度响应慢、跨域协同弱等核心痛点。文档共210页&…

2026/10/4 4:01:03 阅读更多 →
怎么把kgm转mp3?4种方法详细教程,新手也能跟着做

怎么把kgm转mp3?4种方法详细教程,新手也能跟着做

前段时间收拾电脑,发现酷狗音乐文件夹里攒了快200首歌,全是kgm格式。想拷到车载U盘里放,结果插上去根本不认。又试着发给朋友,微信直接提示格式不支持。这才意识到,kgm转mp3这事不解决不行了。 网上搜了一圈&#xff…

2026/10/4 4:00:03 阅读更多 →

最新新闻

单片机AT指令非阻塞配置模块模板:状态机与超时重试机制

单片机AT指令非阻塞配置模块模板:状态机与超时重试机制

搞单片机开发的朋友,十有八九都跟AT指令打过交道。WiFi模块要配ESP8266,蓝牙模块要配HC-05,4G模块要配EC200,GPS模块要配ATGM336H,甚至不少传感器模块都爱用AT指令来设置参数。AT指令本身逻辑很简单,就是“…

2026/10/4 4:41:25 阅读更多 →
Xilinx FPGA上MIPI DPHY接口实战:从CSI-2采集到DSI显示的全流程解析

Xilinx FPGA上MIPI DPHY接口实战:从CSI-2采集到DSI显示的全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 4:41:25 阅读更多 →
复合光源仿真实用指南:VirtualLab Fusion建模全流程解析

复合光源仿真实用指南:VirtualLab Fusion建模全流程解析

做光学系统仿真的人,早晚都会卡在光源这一步。单色平面波确实能解决很多衍射、干涉问题,可一旦你开始处理真实光源——白光LED、多模激光二极管、宽谱超连续谱——就会发现结果怎么都对不上实验,干涉条纹宽度不对、对比度偏大、色散效应完全看…

2026/10/4 4:41:25 阅读更多 →
STM32电梯面板开发实战:从硬件选型到RS485通讯与状态机设计

STM32电梯面板开发实战:从硬件选型到RS485通讯与状态机设计

前阵子帮朋友处理一栋老写字楼的电梯召唤盒问题时,我蹲在门口拆开那台用了十几年的设备,里面是一排继电器和一堆已经发黑的触点。电梯每停一层,盒子里的继电器就噼里啪啦响一阵,楼层指示灯用的小灯泡也黑了两只。我当时就跟朋友说…

2026/10/4 4:41:25 阅读更多 →
分支功能:实现脚本多场景覆盖

分支功能:实现脚本多场景覆盖

分支功能:实现多场景覆盖主线描述脚本要做的功能,分支描述该功能在各条路径上的执行情况。 一份代码,配上 N 个分支场景,得到 N 份测试结论。 项目地址:https://qingxun.online一、问题:脚本在正常情况下通…

2026/10/4 4:41:25 阅读更多 →
Oil Motion三大交付路线全解析:烘焙视频、绿幕视频与透明雪碧图如何自动选型

Oil Motion三大交付路线全解析:烘焙视频、绿幕视频与透明雪碧图如何自动选型

Oil Motion三大交付路线全解析:烘焙视频、绿幕视频与透明雪碧图如何自动选型 【免费下载链接】oil-motion 设计并实现随滚动、拖动、指针或状态变化响应的网页动画,覆盖素材、时间轴和运行时。 项目地址: https://gitcode.com/gh_mirrors/oi/oil-motio…

2026/10/4 4:40:24 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →