<分区>
例如,如果我在 javascript 中有以下函数:
var f1 = function(a, b, c) {}
console.log(f1.length); // 3
但是有了这个函数,输出就不同了:
var f2 = function(a, b, c = 6) {}
console.log(f2.length); // 2
如何计算 f2
的参数数量,包括可选参数?
<分区>
例如,如果我在 javascript 中有以下函数:
var f1 = function(a, b, c) {}
console.log(f1.length); // 3
但是有了这个函数,输出就不同了:
var f2 = function(a, b, c = 6) {}
console.log(f2.length); // 2
如何计算 f2
的参数数量,包括可选参数?
最佳答案
嗯,有点乱,但我相信这应该涵盖大多数边缘情况。
它的工作原理是将函数转换为字符串并对逗号进行计数,但忽略字符串、函数调用或对象/数组中的逗号。我想不出在任何情况下这不会返回适当的金额,但我确定有一个,所以这绝不是万无一失的,但在大多数情况下应该有效。
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;
}
以下是我尝试过的一些测试:https://jsfiddle.net/ekzuvL0c/
关于javascript - 如何计算函数的参数数量,在 javascript 中,包括可选参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51850128/