[英]Pass function arguments to Object.assign
假設我有一個函數從其他對象組成一個對象,我將參數傳遞給函數 - 最初是一個對象文字,然后是我想要組合的對象來擴展對象:
composeFunc({}, obj1, obj2, obj3);
傳遞的args數是可選的,我如何從第二個arg開始將args傳遞給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)); }
...使用rest args查看Thomas的回答 ,因為這是在ES2015中執行此操作的正確方法。
如果你沒有使用ES2015,你可以通過apply
僅使用填充的Object.assign
做同樣的事情:
function composeObj(objs) { return Object.assign.apply(Object, Array.prototype.slice.call(arguments, 1)); }
在那里,我們使用Function#apply
而不是spread運算符(因為ES5和更早版本沒有spread運算符)。 Function#apply
調用你怎么稱呼它使用的第一個參數的函數this
在通話過程中,並使用陣列(或陣列狀的東西),你給它的第二個參數作為參數呼叫。
所以說你有:
obj.foo.apply(obj, [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()
, composeObj
將不再由JS編譯器進行優化。 所以,不要這樣做。
關於TJ Crowders Answer和評論已經說了其他一切; 只是展示更好的實施。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.