函数.arguments中没有ES6默认值?

时间:2016-06-08 14:47:26

标签: javascript ecmascript-6

如果我有这个ES6函数声明和调用:

function myFunction (arg1, arg2 = "bob") {
  console.log("arguments", arguments);
}

myFunction(1);

... console.log()语句只显示一个值为“1”的参数。 “鲍勃”无处可见。这是预期和/或期望的行为吗?我希望arguments对象中可以使用默认值。如果没有,有没有办法以其他方式动态获取所有参数+默认值?

提前致谢!

2 个答案:

答案 0 :(得分:9)

是的,这是预期和期望的。 arguments对象是传递给函数的值的列表,没有别的。

它并不是与参数变量(分配了默认值)有明显联系,就像在草率模式下一样。

  

有没有办法以其他方式动态获取所有参数+默认值?

没有。您拥有哪些参数以及它们是否具有默认初始化程序是静态的,您无需动态执行任何操作。您可以为示例函数执行Object.assign([], arguments, [arg1, arg2])

答案 1 :(得分:1)

正如你现在所知道的那样,没有本地方法来获取"传递参数和默认值,其中参数未被传递"。但有一个解决方法:

这个函数(我发现here)获取给定函数的所有参数:

function getArgs(func) {
  var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
  return args.split(',').map(function(arg) {
  return arg.replace(/\/\*.*\*\//, '').trim();
}).filter(function(arg) {
  return arg;
 });
};

因此,将此函数与函数arguments的{​​{1}}结合使用,我们可以获得具有所需内容的数组:

myFunction

现在,我们可以在控制台中看到调用function myFunction (arg1, arg2 = "bob") { var thisArguments = arguments; console.log(getArgs(myFunction, thisArguments)); }; function getArgs(func, argums) { var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1]; var argsArray = args.split(',').map(function(arg) { return arg.replace(/\/\*.*\*\//, '').trim(); }).filter(function(arg) { return arg; }); for(var i = 0; i < argsArray.length; i++){ argsArray[i] += " (default)"; } var defaults = argsArray.slice(argums.length); argums = Array.prototype.slice.call(argums); return argums.concat(defaults); }; 的信息:

<强> 1。传递的参数多于参数

这将仅返回参数。

myFunction

<强> 2。传递的参数少于参数

将根据需要将参数和余数参数作为默认值返回(我为每个字符串添加了&#34;默认&#34;)。

myFunction("foo", "bar", "baz");
//returns: ["foo", "bar", "baz"]

第3。不传递任何论据

这将返回所有参数。

myFunction("foo");
//returns ["foo", "arg2 = "bob" (default)"]

这是小提琴:https://jsfiddle.net/gerardofurtado/25jxrkm8/1/