一、考试遇到函数的 length
近来考了 12 场试。其中,有一道 js 题让我耿耿于怀!约莫如下:有一个函数,含三个形参,第二个形参有默认值,求该函数的 length。
// 1.已知:
function fn(a, b = 1, c) {
return a + b + c
}
// 2.求解:
console.log(fn.length)
我想,你但凡动手敲一敲,答案就出来了。但是为什么是 1 呢?是指函数形参的默认值有几个吗?如果是第一个形参有默认值呢?如果没有默认值呢?如果没有形参呢?这有什么应用场景吗?我百思不得其解。
于是,在一个夜黑风高、无人问津的晚上,我开始研究函数的 length ......
二、函数的 length 属性
1.无参,函数 length 为 0
function fn() {
log('我是 fn 呀')
}
console.log(fn.length)//0
2.有参无默认值,函数 length 为 形参个数
function fn1(a, b, c) {
return a + b + c
}
console.log(fn1.length)//3
3.有参有默认值,函数 length 为第一个具有默认值之前的参数个数
function fn2(a = 10, b, c) {
return a + b + c
}
console.log(fn2.length)//0
function fn3(a, b = 7, c) {
return a + b + c
}
console.log(fn3.length)//1
function fn4(a, b, c = 3) {
return a + b + c
}
console.log(fn4.length)//2
function fn5(a = 5, b = 9, c = 8) {
return a + b + c
}
console.log(fn5.length)//0
4. 如果函数内部是通过 arguments 调用参数,而没有实际定义参数,则 length 为0
function fn6() {
console.log(arguments.length)
}
console.log(fn6.length)//0
fn6(1, 2)//2
5. Function 构造器的属性 length 为1
console.log(Function.length)// 1
三、函数的 length 代表什么
综上所述:
- 函数的 length 是 js 对象的一个属性,代表形参的个数
- 形参的数量不包括剩余参数的个数,仅包括第一个具有默认值之前的参数个数
- 与之对比的是,arguments.length 是函数被调用时实际传参的个数
可是啊,它到底有何应用场景嘞?