Jeśli używasz ES2015 raczej niż tylko podkładki , można użyć spread notacji Array.from
i slice
:
function composeObj(objs) {
return Object.assign(...Array.from(arguments).slice(1));
}
Albo po prostu za pomocą slice
bezpośrednio zamiast po Array.from
:
function composeObj(objs) {
return Object.assign(...Array.prototype.slice.call(arguments, 1));
}
... zobacz Thomas' answer używając argumentów spoczynkowych, ponieważ jest to właściwy sposób w ES2015.
Jeśli nie używasz ES2015, można zrobić to samo z zaledwie podkładano Object.assign
poprzez apply
:
function composeObj(objs) {
return Object.assign.apply(Object, Array.prototype.slice.call(arguments, 1));
}
tam, używamy Function#apply
zamiast operatora spread (od ES5 i wcześniej nie ma operatora rozprzestrzeniania). Function#apply
dzwoni do funkcji, którą wywołujesz, używając pierwszego argumentu jako this
podczas wywołania, a używając tablicy (lub czegoś podobnego do tablicy) podajesz ją jako drugi argument jako argumenty dla wywołania.
Więc trzeba powiedzieć:
obj.foo(1, 2, 3);
Ekwiwalent za pomocą Function#apply
jest:
obj.foo.apply(obj, [1, 2, 3]);
Pierwszy argument, obj
opowiada apply
co do wykorzystania jako this
podczas rozmowy. Drugi argument to tablica argumentów do użycia.
Ale jeśli używasz operatora rozprzestrzeniania, nie ma potrzeby, rozdziela swój operand tablicy na dyskretne argumenty.
Już przekazałeś argument od 2. jako 'arguments' jest tablicą argumentów przekazanych do funkcji; – itzmukeshy7
@ itzmukeshy7: To nie jest tablica, tylko tablicowa (co jest istotne dla pytania). Ale myślę, że ten przykład miał pokazać tylko to, co chcieli zrobić. Problem polega na tym, że liczba argumentów jest zmienna. –
@ le-moi 'arguments' jest specjalną tablicą zawierającą wszystkie przekazane argumenty; – itzmukeshy7