Czy istnieje sposób na zezwolenie na „nieograniczoną” zmienną dla funkcji w JavaScript?
Przykład:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
Czy istnieje sposób na zezwolenie na „nieograniczoną” zmienną dla funkcji w JavaScript?
Przykład:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
Odpowiedzi:
Jasne, po prostu użyj
arguments
obiektu.źródło
arguments
jest specjalnym obiektem „podobnym do tablicy”, co oznacza, że ma długość, ale nie ma innych funkcji tablicy. Aby uzyskać więcej informacji, zobacz developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... i ta odpowiedź: stackoverflow.com/a/13145228/1766230length
właściwość. Obejmuje toarguments
obiekt. Wiedząc o tym i że metodaconcat
zwraca kopię na tablicy „” To się nazywa dalej, możemy łatwo przekształcićarguments
obiekt do prawdziwej tablicy tak:var args = [].concat.call(arguments)
. Niektórzy wolą używaćArray.prototype.concat.call
zamiast tego, ale podoba mi się to[]
, że są krótkie i słodkie![...arguments].join()
W (najnowszych) przeglądarkach możesz przyjmować zmienną liczbę argumentów za pomocą tej składni:
Oto mały przykład:
Dokumentacja i więcej przykładów tutaj: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters
źródło
Inną opcją jest przekazanie argumentów w obiekcie kontekstowym.
i użyj tego w ten sposób
Ma to tę zaletę, że można dodać dowolną liczbę nazwanych argumentów, a funkcja może ich używać (lub nie) według własnego uznania.
źródło
context
argument za pomocą kodu i przekazać go, zanim zostanie wykorzystany.Zgadzam się z odpowiedzią Kena jako najbardziej dynamiczną i lubię iść o krok dalej. Jeśli jest to funkcja, którą wywołujesz wiele razy z różnymi argumentami - używam projektu Kena, ale następnie dodam wartości domyślne:
W ten sposób, jeśli masz wiele parametrów, ale niekoniecznie musisz je ustawiać przy każdym wywołaniu funkcji, możesz po prostu określić wartości domyślne. W przypadku metody ext możesz użyć metody jQuery's ext (
$.extend()
), stworzyć własną lub zastosować następujące:Spowoduje to scalenie obiektu kontekstu z wartościami domyślnymi i wypełnienie wszelkich niezdefiniowanych wartości w twoim obiekcie wartościami domyślnymi.
źródło
_.defaults()
Metoda podkreślenia jest bardzo dobrą alternatywą do łączenia określonych i domyślnych argumentów.Tak, po prostu tak:
źródło
Lepiej jest używać składni parametru rest, jak wskazał Ramast.
Chcę tylko dodać jakąś fajną właściwość argumentu ... args
źródło
Jak już wspomniano, możesz użyć
arguments
obiektu do pobrania zmiennej liczby parametrów funkcji.Jeśli chcesz wywołać inną funkcję z tymi samymi argumentami, użyj
apply
. Możesz nawet dodawać lub usuwać argumenty, konwertującarguments
na tablicę. Na przykład ta funkcja wstawia tekst przed zalogowaniem się do konsoli:źródło
Chociaż ogólnie zgadzam się, że metoda nazwanych argumentów jest użyteczna i elastyczna (chyba że zależy ci na kolejności, w którym to przypadku argumenty są najłatwiejsze), mam obawy co do kosztu podejścia mbeasley (używanie domyślnych i rozszerzeń). Jest to ogromna kwota, jaką trzeba wziąć za wyciągnięcie wartości domyślnych. Po pierwsze, wartości domyślne są zdefiniowane w funkcji, więc są ponownie wypełniane przy każdym wywołaniu. Po drugie, możesz łatwo odczytać nazwane wartości i jednocześnie ustawić wartości domyślne za pomocą ||. Nie ma potrzeby tworzenia ani łączenia kolejnego nowego obiektu, aby uzyskać te informacje.
Jest to w przybliżeniu ta sama ilość kodu (może nieco więcej), ale powinna stanowić ułamek kosztów środowiska wykonawczego.
źródło
(parameter1=context.parameter1)===undefined && (parameter1=defaultValue1)
lub dla mniejszej objętości kodu mała funkcja pomocnicza, taka jak:function def(providedValue, default) {return providedValue !== undefined ? providedValue : defaultValue;} var parameter1 = def(context.parameter1, defaultValue1)
zapewnia alternatywne wzorce. Jednak mój punkt widzenia jest nadal słuszny: tworzenie dodatkowych obiektów dla każdego wywołania funkcji i uruchamianie drogich pętli w celu ustawienia kilku wartości domyślnych jest szalonym nakładem pracy.Podczas gdy @roufamatic pokazał użycie słowa kluczowego arguments, a @Ken pokazał świetny przykład obiektu do użycia, nie wydaje mi się, aby naprawdę zajął się tym, co dzieje się w tym przypadku i może dezorientować przyszłych czytelników lub zaszczepić złą praktykę, ponieważ nie określa wyraźnie funkcji Metoda / ma na celu przyjmowanie zmiennej liczby argumentów / parametrów.
Gdy inny programista przegląda Twój kod, bardzo łatwo jest założyć, że ta funkcja nie przyjmuje parametrów. Zwłaszcza jeśli programista nie jest wtajemniczony w słowo kluczowe arguments . Z tego powodu dobrym pomysłem jest przestrzeganie wytycznych dotyczących stylu i zachowanie spójności. Będę używać Google do wszystkich przykładów.
Powiedzmy wprost, że ta sama funkcja ma zmienne parametry:
Parametr obiektowy VS var_args
Może się zdarzyć, że obiekt jest potrzebny, ponieważ jest to jedyna zatwierdzona i uważana metoda najlepszej praktyki mapy danych. Tablice asocjacyjne są odrzucone i zniechęcone.
SIDENOTE: Słowo kluczowe argumenty faktycznie zwraca obiekt za pomocą liczb jako klucza. Dziedziczenie prototypowe jest także rodziną obiektów. Zobacz koniec odpowiedzi dla właściwego użycia tablicy w JS
W tym przypadku możemy to również wyraźnie stwierdzić. Uwaga: ta konwencja nazewnictwa nie jest dostarczana przez Google, ale jest przykładem wyraźnej deklaracji typu parametru. Jest to ważne, jeśli chcesz utworzyć bardziej ścisły wzór w kodzie.
Który wybrać?
To zależy od potrzeb twojej funkcji i programu. Jeśli na przykład chcesz zwrócić wartość na podstawie iteracyjnego procesu dla wszystkich przekazanych argumentów, z pewnością trzymaj się słowa kluczowego arguments . Jeśli potrzebujesz definicji argumentów i mapowania danych, wybierz metodę obiektową. Spójrzmy na dwa przykłady i gotowe!
Wykorzystanie argumentów
Wykorzystanie obiektu
Dostęp do tablicy zamiast obiektu („... args” Parametr rest)
Jak wspomniano na górze odpowiedzi, słowo kluczowe argumenty faktycznie zwraca obiekt. Z tego powodu należy wywołać dowolną metodę, której chcesz użyć dla tablicy. Przykład tego:
Aby tego uniknąć, użyj parametru rest:
źródło
Użyj
arguments
obiektu znajdującego się w funkcji, aby mieć dostęp do wszystkich przekazanych argumentów.źródło
Należy pamiętać, że przekazanie obiektu o nazwanych właściwościach, jak sugeruje Ken, zwiększa koszt przydzielania i zwalniania obiektu tymczasowego do każdego wywołania. Przekazywanie normalnych argumentów przez wartość lub odwołanie będzie na ogół najbardziej wydajne. Jednak w wielu aplikacjach wydajność nie jest krytyczna, ale w niektórych przypadkach może być.
źródło