我正在寻找一种方法将函数参数列表转换为单个对象,其中每个参数都会在对象上生成一个具有相应名称的属性。
基本上,我想要达到的目标是:
const foo = function (a, b, c) {
const args = getObjectFromArguments(a, b, c);
// or: getObjectFromArguments(arguments);
// or: getObjectFromArguments();
console.log(args);
// { a: 2, b: 3, c: 4 }
};
foo(2, 3, 4);
如何在不需要提供参数的情况下完成此操作。名称作为参考和作为字符串,理想情况下甚至不使用更复杂的结构?对getObjectFromArguments
的调用应该尽可能简单。
有什么想法吗?
答案 0 :(得分:2)
这是不可能的。
不仅变量名在运行时通常不可用,而且在缩小(或任何其他变换)过程中它们也可能被更改(损坏)。
此外,在将值作为函数参数传递之前评估变量值。这使得存在通用功能(就像你将它命名为getObjectFromArguments
)更不可能。
另一方面 - 整个想法都有气味,可能表明你以极其奇怪的方式做某事(但确实可能有例外)。
答案 1 :(得分:1)
var foo = function(x,y,z) {
console.log(getFnParamNames(arguments));
};
function getFnParamNames(args){
var names = args.callee.toString().match(/\(.*?\)/)[0].replace(/[()]/gi,'').replace(/\s/gi,'').split(','),
result = {};
for (var i in names) {
result[names[i]] = args[i];
}
return result;
}
foo(2,3,4);
但是,由于此解决方案使用arguments.callee
that is forbidden starting from ES5 in strict mode,因此在这种情况下不起作用。
答案 2 :(得分:-1)
一个功能对此是多余的。 The functionality you are looking for is already part of the ES6 syntax as a shorthand notation for object initialisation。您只需要写{ a, b, c }
而不是uselessFunction(a, b, c)
。
const foo = function (a, b, c) {
const args = { a, b, c };
console.log(args);
};
foo(2, 3, 4);

然而,仅使用"&#34>是不可能的。 arguments
对象(你的第二个例子),更不用说没有任何参数的函数(你的最后一个例子)。如果您正在寻找像python's keyword arguments这样的东西,除了只接受一个对象作为参数之外,它目前在JavaScript中是不可能的。