ES6默认值在function.arguments中不可用?
问题描述:
如果我有这样的ES6函数声明和调用:ES6默认值在function.arguments中不可用?
function myFunction (arg1, arg2 = "bob") {
console.log("arguments", arguments);
}
myFunction(1);
...的console.log()
声明只显示一个以“1”的值的说法。 “bob”无处可见。这是预期的和/或期望的行为?我期望默认值将在arguments
对象中可用。如果没有,是否有办法以其他方式动态获取所有参数+默认值?
在此先感谢!
答
是的,这是预期的和期望的。 arguments
对象是传递给函数的值的列表,没有别的。
它不是与参数变量(即被赋予默认值)不相干的链接,就像它处于马虎模式一样。
有没有办法以其他方式动态获取所有参数+默认值?
不需要。您有什么参数以及它们是否具有默认初始值是静态的,您不需要在此动态执行任何操作。你可以为你的示例功能做Object.assign([], arguments, [arg1, arg2])
。
答
正如你现在所知,没有本地方法来获得“传递参数和默认参数不传递”。但有一种变通方法:
此功能(我发现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;
});
};
因此,结合你的函数myFunction
的arguments
这个功能,我们可以得到一个有你想要的数组:
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);
};
现在,我们可以看到在控制台上的信息打电话myFunction
:
1.传递比参数多的参数
这将只返回参数。
myFunction("foo", "bar", "baz");
//returns: ["foo", "bar", "baz"]
2.传递少参数比参数
将返回的参数,其余参数为默认值,只要你想(我加了“默认”每个字符串)。
myFunction("foo");
//returns ["foo", "arg2 = "bob" (default)"]
3传递任何参数
这将返回所有的参数。
myFunction();
//returns ["arg1 (default)", "arg2 = "bob" (default)"]
我我的答案更新,只是为了好玩......看看。 –