javascript - 获取函数的默认值?

标签 javascript ecmascript-6 default-arguments

有没有办法在 JavaScript 中检索函数的默认参数值?

function foo(x = 5) {
    // things I do not control
}

这里有办法得到x的默认值吗?最理想的情况是:

getDefaultValues(foo); // {"x": 5}

请注意,toString 函数将不起作用,因为它会在不常量的默认值上中断。

最佳答案

由于我们在 JS 中没有经典的反射,正如您可以在 C#、Ruby 等上找到的那样,我们必须依靠我最喜欢的工具之一,即正则表达式,来为我们完成这项工作:

let b = "foo";
function fn (x = 10, /* woah */ y = 20, z, a = b) { /* ... */ }

fn.toString()
  .match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m)[1] // Get the parameters declaration between the parenthesis
  .replace(/(\/\*[\s\S]*?\*\/)/mg,'')             // Get rid of comments
  .split(',')
  .reduce(function (parameters, param) {          // Convert it into an object
    param = param.match(/([_$a-zA-Z][^=]*)(?:=([^=]+))?/); // Split parameter name from value
    parameters[param[1].trim()] = eval(param[2]); // Eval each default value, to get strings, variable refs, etc.

    return parameters;
  }, {});

// Object { x: 10, y: 20, z: undefined, a: "foo" }

如果您要使用它,只需确保缓存正则表达式以提高性能。

感谢bubersson有关前两个正则表达式的提示

关于javascript - 获取函数的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934617/

相关文章:

c++ - 具有一个默认参数和一个变量参数的C++构造函数

c++ - 我怎样才能清楚地指定我要传递哪些参数以及哪些参数保持默认?

javascript - 在我将自动播放的首选项更改为 'Allow all Autoplay' 之前,javascript 中的视频播放 () api 在 safari 中不起作用

javascript - 当未选择选择元素的第二个选项时禁用按钮

javascript - 如何使用 chai 检查元素类型?

javascript - 如何从对象中的 forEach 中获取搜索结果?

javascript - 如果使用 var 重新声明会对现有变量产生影响

javascript - 在 .row-fluid 容器中 Bootstrap .row

javascript - react : Dynamic row failed

c++ - 具有默认值的单参数构造函数是否与默认构造函数相同?