Javascript 获取包含默认参数的函数参数长度

Javascript 获取包含默认参数的函数参数长度,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,如果使用Function.length属性,则会得到该函数所需的参数总数 但是,根据文档(以及实际试用),它在计数中不包括默认参数 此数字不包括rest参数,仅包括第一个具有默认值的参数之前的参数 我是否可以(从函数外部)以某种方式获得一个包含默认参数的计数?也许您可以自己解析它,比如: 函数getNumArguments(func){ var s=func.toString(); var index1=s.indexOf('('); var index2=s.indexOf('); 返回s

如果使用
Function.length
属性,则会得到该函数所需的参数总数

但是,根据文档(以及实际试用),它在计数中不包括默认参数

此数字不包括rest参数,仅包括第一个具有默认值的参数之前的参数


我是否可以(从函数外部)以某种方式获得一个包含默认参数的计数?

也许您可以自己解析它,比如:

函数getNumArguments(func){ var s=func.toString(); var index1=s.indexOf('('); var index2=s.indexOf('); 返回s.substr(index1+1,index2-index1-1); }
log(getNumArguments(函数(param1,param3='test',…param2){})//3将我的答案从a复制到这里:

嗯,有点乱,但我相信这应该涵盖大多数边缘情况

它的工作原理是将函数转换为字符串并计算逗号,但忽略字符串、函数调用或对象/数组中的逗号。我想不出任何情况下,这将不会返回适当的金额,但我相信有一个,所以这不是万无一失,但在大多数情况下应该工作

更新:有人向我指出,这不适用于
getNumArgs(a=>{})
getNumArgs(函数(a){}.bind(null))
等情况,因此如果您尝试使用它,请注意这一点

function getNumArgs(func) {
  var funcStr = func.toString();
  var commaCount = 0;
  var bracketCount = 0;
  var lastParen = 0;
  var inStrSingle = false;
  var inStrDouble = false;
  for (var i = 0; i < funcStr.length; i++) {
    if (['(', '[', '{'].includes(funcStr[i]) && !inStrSingle && !inStrDouble) {
      bracketCount++;
      lastParen = i;
    } else if ([')', ']', '}'].includes(funcStr[i]) && !inStrSingle && !inStrDouble) {
      bracketCount--;
      if (bracketCount < 1) {
        break;
      }
    } else if (funcStr[i] === "'" && !inStrDouble && funcStr[i - 1] !== '\\') {
      inStrSingle = !inStrSingle;
    } else if (funcStr[i] === '"' && !inStrSingle && funcStr[i - 1] !== '\\') {
      inStrDouble = !inStrDouble;
    } else if (funcStr[i] === ',' && bracketCount === 1 && !inStrSingle && !inStrDouble) {
      commaCount++;
    }
  }

  // Handle no arguments (last opening parenthesis to the last closing one is empty)
  if (commaCount === 0 && funcStr.substring(lastParen + 1, i).trim().length === 0) {
    return 0;
  }

  return commaCount + 1;
}
函数getNumArgs(func){ var funcStr=func.toString(); var commaCount=0; var bracketCount=0; var lastParen=0; var inStrSingle=假; var inStrDouble=false; 对于(变量i=0;i
以下是我尝试过的几个测试:

看看这个:一般来说,对于这样的问题,最好把注意力集中在你试图解决的问题上。文档清楚地陈述了事实,计数没有暴露出来,所以现在答案是“不”“,而如果你解释了你想做什么,人们将能够更有效地指导你。你不应该依赖
Function.length
。为什么?因为你会遇到麻烦-就像已经发生的那样。你需要这个做什么?当你在默认值中有一个函数(或任何带有逗号的括号)时,这不起作用initialiser@Bergi我试图在回答一个类似的问题时解决这个问题:@Mogzol你可能想在这里发布你的答案(我已将另一个作为副本关闭)