推荐答案
函数的 length 属性表示函数期望接收的形参的个数。它不包括剩余参数(rest parameters)、默认参数和解构赋值参数。简而言之,length 属性计算的是函数定义时明确声明的必选参数的数量。
本题详细解读
length属性的定义:length是函数对象的一个内置属性,它返回一个整数值。这个值等于函数定义中声明的形参的个数。形参 vs. 实参:
- 形参(parameters):函数定义时,在函数签名中声明的变量名,例如
function add(a, b) { ... }中的a和b。 - 实参(arguments):函数调用时,传递给函数的实际值,例如
add(1, 2)中的1和2。 length属性只关心形参的数量,与调用时传入的实参数量无关。
- 形参(parameters):函数定义时,在函数签名中声明的变量名,例如
length属性的计算规则:- 普通参数:每一个声明的普通参数都会增加
length属性的值。 - 剩余参数(rest parameters):剩余参数使用
...表示,例如function func(a, ...rest) { ... },剩余参数不会计入length属性。 - 默认参数:默认参数在形参列表中用
=赋值,例如function greet(name = "Guest") { ... },默认参数不会计入length属性。 - 解构赋值参数:解构赋值参数也不会计入
length属性,例如function point({x, y}) { ... }。
- 普通参数:每一个声明的普通参数都会增加
示例:
// www.javascriptcn.com code example function func1(a, b, c) { } console.log(func1.length); // 输出 3 function func2(a, b, ...rest) { } console.log(func2.length); // 输出 2 function func3(a, b = 2, c) { } console.log(func3.length); // 输出 1 function func4({ x, y }) { } console.log(func4.length); // 输出 0 function func5(a, {x,y}, c, ...rest){ } console.log(func5.length); // 输出 2length属性的使用场景:- 参数校验:虽然不绝对可靠,但可以通过
length属性获取函数期望的参数个数,对传入的参数进行初步校验,以确保函数正常运行。 - 高阶函数:某些高阶函数可能需要根据目标函数的形参个数进行适配,
length属性可以提供相关信息。 - 函数自省:在调试和编写框架时,可以利用
length属性对函数进行分析。
- 参数校验:虽然不绝对可靠,但可以通过
length属性与arguments.length的区别:length是函数对象的属性,表示期望的形参个数。arguments.length是在函数内部使用的一个类数组对象,表示函数调用时传入的实际参数个数。- 这两个属性的含义和使用场景不同。
arguments对象已不推荐使用,推荐使用剩余参数...rest。