Javascript 使用对象作为函数参数

Javascript 使用对象作为函数参数,javascript,Javascript,问题在代码示例中 我可以自动“拆开”PAR对象来使用这些属性来填充函数参数吗? javascript中是否存在某种foo(par.unwrap()) 你可以试试 var foo = function(a, b, c) { console.log(a); console.log(b); console.log(c.id); }; //this works obviously foo("a man", "b man", {id: "c.id man"}); var par =

问题在代码示例中

我可以自动“拆开”PAR对象来使用这些属性来填充函数参数吗?

javascript中是否存在某种
foo(par.unwrap())

你可以试试

var foo = function(a, b, c) {

  console.log(a);
  console.log(b);
  console.log(c.id);

};

//this works obviously
foo("a man", "b man", {id: "c.id man"}); 

var par = {
  a: "a val",
  b: "b cal",
  c: {
    id: "c.id val"
  }
};


//can I make this work automatically?
foo(par);

JavaScript参数名称可以是任意的和不相关的,因此它不会太重视它们。换句话说,您不能基于名称设置特定参数。更重要的是它们的索引

如果需要,可以使用
foo.apply()
将它们传入:

var parWorking = ["a val", "b cal", {
    id: "c.id val"
  }
];
foo.apply(this, parWorking);

你自己做很容易吗

foo.apply(null /* the context */, parAsArray);

您可以为该对象创建upwrap()方法

var args = [];
for(var p in par){
    args.push(par[p]);
}
console.log(args); // ["a val", "b cal", Object { id="c.id val"}]

foo.apply(this, args);

您可以,但鉴于对象属性是无序的,这有点不规范。解决方案是将函数解析为字符串,以获取参数的名称

下面是一个实用函数:

var foo = function(a,b,c) {

  console.log(a);
  console.log(b);
  console.log(c.id);

};

 var par = {
  a: "a val",
  b: "b cal",
  c: {
    id: "c.id val"
  },
  unwrap:function(){
    var valueArray=[];
    for(key in this){
      if(typeof this[key]!=="function"){
        valueArray.push(this[key]);
      }

    }
    return valueArray;
  }
};



foo("a man", "b man", {id: "c.id man"}); 
foo.apply(null,par.unwrap())
用法示例

function callunwrap(f,o){
    f.apply(null, (f.toString().match(/\([^\)]*\)/)[0].match(/\w+/g)||[]).map(function(name){
        return o[name];
    }));
}

现在,正如您所看到的,
callunwrap
做了很多事情,我不建议在真正的程序中使用这样一种黑客行为。通常的非黑客解决方案是让函数显式读取参数:

var foo = function(a, b, c) {
  console.log(a);
  console.log(b);
  console.log(c.id);
};

var par = {
  a: "a val",
  b: "b cal",
  c: {
    id: "c.id val"
  }
};


callunwrap(foo, par);

如果您使用ES-6参数解构,您可以做到这一点。这样做的方法是定义函数,如

var foo = function(o) {
  console.log(o.a);
  console.log(o.b);
  console.log(o.c.id);
};

您可以不自动查看演示

,但可以检查参数类型并执行必要的操作<代码>参数是动态的。不,不能。我对我们看到的问题作了回答。但也许这是XY的问题,你忘了告诉我们你为什么要这样做?这实际上符合我的场景,谢谢,非常有趣。我使用对象作为数组解决方案,因为它最适合我的场景,但您的答案最能回答我的问题。
function foo({a, b, c}) {
  //here just use a, b, c as you want;
}

var par = {
  a: "a val",
  b: "b cal",
  c : {
  id: "c.id val"
 }
};
foo(par);