将函数参数传递给Object.assign

Pass function arguments to Object.assign

本文关键字:Object assign 参数传递 函数      更新时间:2023-09-26

假设我有一个函数来从其他对象组成一个对象,我将参数传递给该函数-最初是一个对象文字,然后是我想要组成的对象以扩展对象:

composeFunc({}, obj1, obj2, obj3);

传递的参数数量是可选的,然后如何从第二个参数开始将参数传递给Object.assign()。因此,函数将类似于以下内容:

function composeObj(objs) {
    return Object.assign(arguments[1], arguments[2], arguments[3]... etc);
}

提前感谢:)

如果您使用的是ES2015而不仅仅是垫片,您可以使用排列符号Array.fromslice:

function composeObj(objs) {
    return Object.assign(...Array.from(arguments).slice(1));
}

或者直接使用slice而不是在Array.from:之后

function composeObj(objs) {
    return Object.assign(...Array.prototype.slice.call(arguments, 1));
}

。。。请参阅Thomas使用rest args的回答,因为这是ES2015中正确的方法。

如果你没有使用ES2015,你可以通过apply:使用一个加垫片的Object.assign来做同样的事情

function composeObj(objs) {
    return Object.assign.apply(Object, Array.prototype.slice.call(arguments, 1));
}

在这里,我们使用Function#apply而不是排列运算符(因为ES5和早期版本没有排列运算符)。Function#apply在调用过程中使用第一个参数作为this来调用调用它的函数,并使用数组(或类似数组的东西)作为第二个参数作为调用的参数。

所以说你有:

obj.foo(1, 2, 3);

使用Function#apply的等价物是:

obj.foo.apply(obj, [1, 2, 3]);

第一个参数obj,告诉apply在调用期间使用什么作为this。第二个参数是要使用的参数数组。

但是,如果使用扩展运算符,则没有必要,它会将类似数组的操作数扩展为离散参数。

ES2015:

function composeObj(objs, ...rest){
  return Object.assign(...rest);
}

rest将是从第二个参数开始的所有参数的真实数组。

和巴别塔输出:

function composeObj(objs) {
  for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
    rest[_key - 1] = arguments[_key];
  }
  return Object.assign.apply(Object, rest);
}

这似乎是一个可能在所有地方都使用的实用函数。一旦将arguments传递给其他函数(如Array.prototype.slice()Array.from()),JS编译器就不会再优化composeObj。所以,不要那样做。

其他一切都已经在T.J.Crowders Answer和评论上说了;只是显示了更好的实现。