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你可能想在这里发布你的答案(我已将另一个作为副本关闭)