javascript - 如何计算函数的参数数量,在 javascript 中,包括可选参数?

标签 javascript ecmascript-6

<分区>

例如,如果我在 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/

相关文章:

javascript - Angular http post 请求 - 请求的资源上不存在 'Access-Control-Allow-Origin' header

javascript - 完全卡住 const 变量

javascript - Array.from 与 A​​rray.prototype.map

javascript - Object.assign——覆盖嵌套属性

javascript - 如何比较 Handlebars 中变量的值

javascript - 创建组件的多个实例而无需多次导入

javascript - 如何使用函数的参数来使用对象的数据?

javascript - 为什么这个映射函数不改变原始数组中的值?

javascript - 单击按钮时连续重复翻转动画?

javascript - 防止div重叠