如果我有这个ES6函数声明和调用:
function myFunction (arg1, arg2 = "bob") {
console.log("arguments", arguments);
}
myFunction(1);
... console.log()
语句只显示一个值为“1”的参数。 “鲍勃”无处可见。这是预期和/或期望的行为吗?我希望arguments
对象中可以使用默认值。如果没有,有没有办法以其他方式动态获取所有参数+默认值?
提前致谢!
答案 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)"]