function.length 返回函数声明的必填形参数量,不计 rest、默认值及解构参数;可用于调用前轻量校验实参个数,但不能替代业务逻辑校验。

Function.length 属性返回函数定义时声明的形参个数(不包括 rest 参数),它在运行时是只读、不可配置的,可用于在调用前快速判断实参数量是否“表面合规”。但它不能替代业务级校验,需结合具体契约逻辑使用。
理解 Function.length 的行为边界
该属性仅统计函数声明中**非 rest、非默认值、非解构参数**的数量。例如:
-
(a, b) => {}→length === 2 -
(a, b = 1) => {}→length === 1(遇到第一个带默认值的参数即停止计数) -
(a, ...rest) => {}→length === 1(rest 参数不计入) -
({ x }, [y]) => {}→length === 2(解构参数仍算作一个形参)
在函数调用前做轻量级参数数量拦截
适用于工具函数、中间件或 SDK 入口,避免明显错误调用进入核心逻辑:
- 获取目标函数的
fn.length - 对比
arguments.length或Array.from(arguments).length(注意箭头函数无arguments) - 若实参少于声明形参个数(且无默认值兜底),可提前抛错或返回提示
示例:
function validateArity(fn, ...args) {
const expected = fn.length;
const actual = args.length;
// 只对「必填参数不足」做硬性拦截(默认值参数已由 JS 自行处理)
if (actual
与业务契约结合的关键补充点
length 只管“形参声明”,不管“业务语义”。例如:
- 一个函数
createUser(name, email, role = 'user')声明length === 2,但业务上email可能为必填,role是可选——此时需额外规则配置 - 建议用元数据(如 Symbol 或注释解析)或独立契约对象描述真实必填字段,再与
length协同判断 - 对于动态参数场景(如根据
type字段决定后续字段),length完全失效,应交由运行时 schema 校验(如 Zod、Joi)
实际工程中的推荐姿势
- 开发阶段:用 TypeScript 类型系统 + IDE 提示覆盖大部分参数契约,
length不作为主要手段 - 运行时防御:在 API 网关、RPC 序列化层、CLI 命令分发器等统一入口处,用
length快速过滤明显错调用 - 调试辅助:配合
console.trace()或日志,在参数异常时打印fn.name和fn.length,加速定位调用方问题










