将函数参数传递给Object.assign
Pass function arguments to Object.assign
假设我有一个函数来从其他对象组成一个对象,我将参数传递给该函数-最初是一个对象文字,然后是我想要组成的对象以扩展对象:
composeFunc({}, obj1, obj2, obj3);
传递的参数数量是可选的,然后如何从第二个参数开始将参数传递给Object.assign()
。因此,函数将类似于以下内容:
function composeObj(objs) {
return Object.assign(arguments[1], arguments[2], arguments[3]... etc);
}
提前感谢:)
如果您使用的是ES2015而不仅仅是垫片,您可以使用排列符号Array.from
和slice
:
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和评论上说了;只是显示了更好的实现。
- 如何使用object.assign()从其他对象引用基本对象属性
- Object.assign(),函数方法和内存使用
- 是否可以使用Object.assign来克隆带有其方法的对象
- 何时需要使用Object.assign()方法来复制对象的实例
- 将函数参数传递给Object.assign
- javascript Object.assign() functionality
- “Object.assign()”polyfill中“Object(target)”的用途是什么
- Object.assign 和 just as assign 之间的区别
- 由 Object.Assign() 函数生成的复制对象具有副作用
- 使用 Object.create() 和 Object.assign() 创建对象有什么区别?
- 使用object.assign()添加到对象中的getter发现闭包变量的值错误
- 使用Object.assign和class/extends有什么区别
- Object.assign()更改顺序
- Object.assign()创建深层副本还是浅层副本
- Object.assign未按预期工作
- Object.assign保留对原始对象的引用
- Ecma6,Object.assign 不做深度复制
- 使用Object.assign和Object.create进行继承
- 什么's相当于Javascript's C#中的Object.assign()
- 在JavaScript中实现Object.Assign()的另一种方法