JavaScript函数的length属性精确反映其定义时显式声明的形参个数,遵循“从左到右、遇默认值即停”规则,统计第一个带默认值参数前的普通形参个数,剩余参数不计入,且该属性只读、不参与运行时校验。

JavaScript 中函数的 length 属性直接反映函数定义时**显式声明的形参个数**,但它不是简单数“写了几个参数”,而是遵循一套明确的语法解析规则。它不关心你调用时传了多少个实参,也不参与运行时逻辑,只看函数声明本身的结构。
怎么获取形参个数
直接访问函数对象的 length 属性即可:
-
function foo(a, b) {}→foo.length === 2 -
const bar = (x, y, z) => x + y + z;→bar.length === 3 -
class C { constructor(a, b) {} }→C.length === 2(等价于 constructor 的 length) -
function baz() {}→baz.length === 0
核心规律:从左到右,遇默认值即停
length 统计的是**第一个带默认值的形参之前**的普通形参个数。剩余参数(...args)本身不计入,且它前面的参数仍被正常统计。
-
function f(a, b = 1) {}→f.length === 1(b是第一个默认参数,a在它左边) -
function g(a = 1, b) {}→g.length === 0(a自身就是第一个默认参数,左边无参数) -
function h(a, ...rest) {}→h.length === 1(rest不计入,a有效) -
function i([x] = [0]) {}→i.length === 1(整个解构参数算一个形参,且带默认值,左侧无非默认参数)
bind 和箭头函数也遵守同一规则
绑定函数和箭头函数的 length 并非例外,而是延续了相同的语义:
立即学习“Java免费学习笔记(深入)”;
-
const add = (a, b) => a + b;→add.length === 2 -
const add5 = add.bind(null, 5);→add5.length === 1(原 length 减去已绑定的前置参数个数) -
const always = () => 42;→always.length === 0 -
Function构造器自身length为 1;Function.prototype的length为 0
常见误区提醒
length 容易被误读为“最少要传几个参数”,但它既不强制校验,也不影响调用行为:
-
function fn(a, b = 2) {},fn.length === 1,但fn()、fn(1)、fn(1, 3)全部合法 -
arguments.length才是调用时实际传入的实参个数,与length完全无关 - 解构、对象参数、函数体内逻辑,都不会改变
length值 - 它是一个只读属性(
Writable: false),不能被修改


















