JavaScript中函数的length属性表示定义时声明的形参个数,而非调用时传入的实参个数;它只统计非默认参数、非剩余参数前的形参,如function bar(x, y = 10, z) {}的length为1,且该值在函数创建时即确定、只读。

JavaScript 中的 length 属性并不表示函数实际接收了多少参数,而是反映函数定义时声明的形参个数。 它是函数对象的一个只读属性,用于描述“期望接收多少个参数”,而非运行时传入了多少个实参。
length 只看函数定义,不看调用
函数的 length 值在函数创建时就已确定,仅统计**非默认参数、非剩余参数(rest parameter)之前的形参个数**:
-
普通函数:
function foo(a, b, c) {}→foo.length === 3 -
含默认参数:
function bar(x, y = 10, z) {}→bar.length === 1(遇到第一个默认参数即停止计数) -
含剩余参数:
function baz(a, ...rest) {}→baz.length === 1(rest 参数不计入) -
箭头函数:同样适用,
const fn = (a, b) => {}→fn.length === 2
它和 arguments.length 完全不同
function.length 是静态的元信息;而 arguments.length(或现代写法中的 ...args 数组长度)是动态的运行时信息:
-
function test(a, b) { console.log(arguments.length); }
调用test(1)输出1,test(1, 2, 3)输出3 - 但
test.length始终是2,不会因调用变化
常见用途:函数签名检查与柯里化基础
虽然不能用于运行时参数校验,但 length 在工具函数中很有价值:
立即学习“Java免费学习笔记(深入)”;
-
自动柯里化:根据
fn.length判断还需收集几个参数才执行 - 参数补全提示:编辑器或类型系统(如 TypeScript 编译前)可据此推断最小调用要求
- 函数适配器:包装函数时保持原始预期参数数量,便于调试或反射
注意边界情况
以下情形会让 length 表现不符合直觉:
-
解构参数:
function f([a, b], { c }) {}→f.length === 2(每个解构形参算一个) -
getter/setter 方法:访问器函数的
length恒为0(即使有参数也忽略) -
bind 后的函数:
fn.bind(null, 1).length返回max(0, fn.length - 1)(预置参数会减少待填数量)


















