将参数转换为对象?

时间:2016-08-03 07:21:51

标签: javascript

我正在寻找一种方法将函数参数列表转换为单个对象,其中每个参数都会在对象上生成一个具有相应名称的属性。

基本上,我想要达到的目标是:

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的调用应该尽可能简单。

有什么想法吗?

3 个答案:

答案 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中是不可能的。