Czy jest możliwe wysłanie zmiennej liczby argumentów do funkcji JavaScript z tablicy?
var arr = ['a','b','c']
var func = function()
{
// debug
alert(arguments.length);
//
for(arg in arguments)
alert(arg);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
Niedawno napisałem dużo Pythona i to wspaniały wzorzec, aby móc akceptować varargi i je wysyłać. na przykład
def func(*args):
print len(args)
for i in args:
print i
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(*arr) // prints 4 which is what I want, then 'a','b','c','d'
Czy w JavaScript można wysłać tablicę, która ma być traktowana jako tablica argumentów?
javascript
variadic-functions
Fire Crow
źródło
źródło
for - in
pętli zarguments
obiektem -length
zamiast tego należy użyć „normalnej” pętli for iterującej po właściwościOdpowiedzi:
Aktualizacja : od wersji ES6 możesz po prostu użyć składni spreadu podczas wywoływania funkcji:
Ponieważ ES6 również, jeśli spodziewasz się traktować swoje argumenty jako tablicę, możesz również użyć składni rozkładów na liście parametrów, na przykład:
I możesz to połączyć z normalnymi parametrami, na przykład jeśli chcesz otrzymać dwa pierwsze argumenty osobno, a resztę jako tablicę:
A może przydaje się to, że wiesz, ile argumentów oczekuje funkcja:
Ale w każdym razie możesz przekazać dowolną liczbę argumentów ...
Składnia spreadu jest krótsza i „słodsza” niż,
apply
a jeśli nie musisz ustawiaćthis
wartości w wywołaniu funkcji, to jest właściwy sposób.Oto przykład zastosowania , który był wcześniejszym sposobem:
Obecnie zalecam używanie
apply
tylko wtedy, gdy musisz przekazać dowolną liczbę argumentów z tablicy i ustawićthis
wartość.apply
takes tothis
wartość jako pierwsze argumenty, które zostaną użyte przy wywołaniu funkcji, jeśli używamynull
w kodzie nieścisłym,this
słowo kluczowe będzie odnosić się do obiektu Global (okna) wewnątrzfunc
, w trybie ścisłym, gdy jawnie użyjemy 'use strict 'lub w modułach ESnull
.Zauważ również, że
arguments
obiekt nie jest tak naprawdę tablicą, możesz go przekonwertować przez:A w ES6:
Ale obecnie rzadko używasz tego
arguments
obiektu bezpośrednio dzięki składni rozprzestrzeniania.źródło
Array.prototype.slice.call(arguments);
zapobiega optymalizacji JS przeglądarki, takiej jak V8. Szczegóły tutajarguments
planuje się wycofać na korzyść operatora spreadu . Nie mam na to źródła, ale gdzieś to słyszałem. 2. MDN stwierdza, że użycieslice
naarguments
obiekcie zapobiega optymalizacji w silnikach takich jak V8. Sugerują użycie „pogardzanego konstruktora Array”Array.from(arguments)
, lub[...arguments]
. Czy zechciałbyś zaktualizować swoją odpowiedź dotyczącą ES2015?W rzeczywistości możesz przekazać dowolną liczbę wartości do dowolnej funkcji javascript. Jawnie nazwane parametry otrzymają kilka pierwszych wartości, ale WSZYSTKIE parametry zostaną zapisane w tablicy argumentów.
Aby przekazać tablicę argumentów w formie „rozpakowanej”, możesz użyć Apply, tak jak w przypadku (patrz Funkcjonalny JavaScript ):
źródło
Operatory splat i spread są częścią ES6, planowanej następnej wersji Javascript. Jak dotąd tylko Firefox je obsługuje. Ten kod działa w FF16 +:
Zwróć uwagę na składnię awkard dla rozprzestrzeniania. Zwykła składnia nie
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
jest jeszcze obsługiwana . Tabelę kompatybilności ES6 znajdziesz tutaj .Zwróć również uwagę na użycie
for...of
innego dodatku ES6. Używaniefor...in
dla tablic to zły pomysł .źródło
apply
Funkcja przyjmuje dwa argumenty; obiektthis
zostanie powiązany, a argumenty reprezentowane przez tablicę.źródło
Od ES2015 istnieją dwie metody.
arguments
obiektuTen obiekt jest wbudowany w funkcje i odpowiednio odwołuje się do argumentów funkcji. Jednak technicznie nie jest to tablica, więc typowe operacje tablicowe nie będą na niej działać. Sugerowaną metodą jest użycie
Array.from
lub operatora spreadu w celu utworzenia z niego tablicy.Widziałem inne odpowiedzi, w których wspominano o użyciu
slice
. Nie rób tego. Zapobiega optymalizacjom (źródło: MDN ).Jednak uważam, że
arguments
jest to problematyczne, ponieważ ukrywa to, co funkcja przyjmuje jako dane wejściowe.arguments
Funkcja zwykle jest napisane tak:Czasami nagłówek funkcji jest zapisywany w następujący sposób, aby udokumentować argumenty w sposób podobny do C:
Ale to rzadkie.
Jeśli chodzi o powody, dla których jest to problematyczne, weźmy na przykład C. C jest wstecznie kompatybilny ze starożytnym dialektem języka sprzed ANSI znanym jako K&R C. K&R C pozwala prototypom funkcji mieć pustą listę argumentów.
ANSI C udostępnia funkcję
varargs
(...
) ivoid
określa pustą listę argumentów.Wiele osób nieumyślnie deklaruje funkcje z
unspecified
listą argumentów (int myfunction();
), gdy oczekują, że funkcja przyjmuje zero argumentów. Jest to technicznie to błąd, ponieważ funkcja będzie akceptować argumenty. Dowolna ich liczba.Właściwa
varargs
funkcja w C ma postać:A JavaScript faktycznie ma coś podobnego.
Parametry operatora / odpoczynku
Właściwie już pokazałem wam operator spreadu.
Jest dość wszechstronny i może być również użyty na liście argumentów funkcji ("parametry reszty"), aby określić varargs w ładnie udokumentowany sposób:
Lub jako wyrażenie lambda:
O wiele bardziej wolę operatora rozprzestrzeniania. Jest czysty i samodokumentujący.
źródło
Nazywa się
splat
operatorem. Możesz to zrobić w JavaScript używającapply
:źródło
W ES6 możesz użyć parametrów reszt dla
varagrs
. Pobiera listę argumentów i konwertuje ją na tablicę.źródło
To jest przykładowy program do obliczania sumy liczb całkowitych dla zmiennych argumentów i tablicy na liczbach całkowitych. Mam nadzieję że to pomoże.
źródło
var
deklarujefunction scope
zmienną. Nowelet
iconst
słowa kluczowe (ES 2015) deklarująblock scope
zmienne. Jednak przed ES 2015 zmienne należało nadal podnosić na szczyt funkcji w ramach praktyki. 2. przerw funkcyjne gdy podaje się 1 wartość całkowitą z powodu swojej błędnej akceptacji tablicę jako argument (pytanie pyta o varargs; nie akceptując tablic jako argumentów)CalculateSum(6) -> 0
. (kontynuacja w następnym poście)alert
. Właściwie, po prostu nie używajalert/prompt/confirm
, kropka. Użyjconsole.log
zamiast tego podczas debugowania. 4. Funkcja powinna byćreturn
wartością, a niealert
nią. 5. Unikaj,PascalCase
chyba że odnosi się to do „typu” danych. To znaczy klasa. UżyjcamelCase
lubunder_score
zamiast. 4. Nie podoba mi się sposób, w jaki deklarujesz swoje funkcje.var f = function(){ ... }
oznacza, że chcesz, aby w pewnym momencie się to zmieniło , co prawdopodobnie nie jest Twoim zamiarem.function name(){ ... }
Zamiast tego użyj konwencjonalnej składni.źródło
Dla tych, którzy zostali tutaj przekierowani z Przekazywanie zmiennej liczby argumentów z jednej funkcji do drugiej (co nie powinno być oznaczane jako duplikat tego pytania):
Jeśli próbujesz przekazać zmienną liczbę argumentów z jednej funkcji do drugiej, od czasu JavaScript 1.8.5 możesz po prostu wywołać
apply()
drugą funkcję i przekazaćarguments
parametr:Uwaga: pierwszym argumentem jest
this
parametr, którego należy użyć. Przekazanienull
wywoła funkcję z kontekstu globalnego, tj. Jako funkcję globalną zamiast metody jakiegoś obiektu.Zgodnie z tym dokumentem specyfikacja ECMAScript 5 na nowo zdefiniowała
apply()
metodę tak, aby przyjmowała dowolny „ogólny obiekt przypominający tablicę” zamiast wyłącznie tablicy. W ten sposób możesz bezpośrednio przekazaćarguments
listę do drugiej funkcji.Testowane w Chrome 28.0, Safari 6.0.5 i IE 10. Wypróbuj to z tym JSFiddle .
źródło
Tak, możesz przekazać zmienną nie. argumentów do funkcji. Możesz użyć,
apply
aby to osiągnąć.Na przykład:
źródło
Czy chcesz, aby funkcja reagowała na argument tablicy lub argumenty zmiennych? Jeśli to drugie, spróbuj:
Ale jeśli chcesz obsłużyć argument tablicy
źródło