ES6默认值在function.arguments中不可用?

问题描述:

如果我有这样的ES6函数声明和调用:ES6默认值在function.arguments中不可用?

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

myFunction(1); 

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

在此先感谢!

+0

我我的答案更新,只是为了好玩......看看。 –

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

它不是与参数变量(即被赋予默认值)不相干的链接,就像它处于马虎模式一样。

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

不需要。您有什么参数以及它们是否具有默认初始值是静态的,您不需要在此动态执行任何操作。你可以为你的示例功能做Object.assign([], arguments, [arg1, arg2])

+0

谢谢。那么这是否意味着没有办法获得“传递参数和默认参数未被传递”的对象? – hairbo

+0

'Object.assign'解决方案很好 - 我正在设想检查数组的长度和拼接等来处理这个问题。 –

+0

@JamesThorpe:这里的简单选择是'var args = Array.from(arguments); args [1] = arg2;' – Bergi

正如你现在所知,没有本地方法来获得“传递参数和默认参数不传递”。但有一种变通方法:

此功能(我发现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; 
}); 
}; 

因此,结合你的函数myFunctionarguments这个功能,我们可以得到一个有你想要的数组:

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)"] 

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

+1

这很有趣。谢谢! – hairbo

+0

也有趣的更新,虽然它看起来结果没有变量的实际值的可执行格式,对吗? – hairbo