为什么我不能用默认值获取参数长度?

时间:2017-02-11 05:52:22

标签: javascript ecmascript-6

我有一个像

这样的功能
function f(a=1, b) {
  console.log(a, b);
}
console.log(f.length);

我希望获得f f.length的长度,但我得到的是 0 而不是 2 。但是当我将a更改为普通形式参数而没有默认值时,f.length的结果是 2 ,为什么?

2 个答案:

答案 0 :(得分:4)

预期的行为是什么,请检查MDN docs of Function.length

  

length是函数对象的一个​​属性,表示函数期望的参数数量,即形式参数的数量。此数字不包括rest参数,仅包含第一个参数之前的参数,默认值为。相比之下,arguments.length是函数的本地,并提供实际传递给函数的参数数量。

答案 1 :(得分:2)

MDN docs中所说,

  

Function.length包含第一个参数之前的参数   默认值。

在您的示例函数中,第一个参数本身的默认值为1,因此Function.length不包含您在a之后提供的任何参数。

因此它为您提供了值0

为了让事情更清晰,请考虑以下片段:

//no arguments with default value
function f(a, b) {
  console.log('hello');
}
console.log('No of arguments ' + f.length);

输出为2

//second argument has defualt value. Thus only argument a that is before the 
//argument having default value is included by Function.length
function f(a, b=1) {
  console.log('hello');
}
console.log(f.length);

输出为1

//second argument has defualt value .
//but only arguments before the argument having default value are included
//thus b and c are excluded
function f(a, b=2, c) {
  console.log('hello');
}
console.log(f.length);

输出为1