W ES6 / ES2015 parametry domyślne są zgodne ze specyfikacją języka.
function read_file(file, delete_after = false) {
// Code
}
po prostu działa.
Odniesienie: parametry domyślne - MDN
Domyślne parametry funkcji pozwalają na zainicjowanie parametrów formalnych wartościami domyślnymi, jeśli nie zostanie przekazana żadna wartość lub niezdefiniowana .
Możesz także symulować domyślne parametry nazwane poprzez destrukcję :
// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
// Use the variables `start`, `end` and `step` here
···
}
Pre ES2015 ,
Jest wiele sposobów, ale jest to moja preferowana metoda - pozwala przekazać wszystko, co chcesz, w tym fałsz lub zero. ( typeof null == "object"
)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }
a następnie możesz nazwać to jakoa = defaultFor(a, 42);
undefined
obiektów: p Nawet jeśli może działać z niektórymi przeglądarkami i może być szybszy,null
wciąż jest obiektem iundefined
odnosi się do prymitywnego typu, który próbuje powiedzieć, że istnieje nic, nawet tutajnull
. Zobacz oba przypadki w skrócie: JavaScript / Reference / Global_Objects / undefined .typeof
jest to zbędne.function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
Nie spowoduje to wyrzucenia błędów odniesienia i jest zwięzłe.a = a
ib = b
kiedy te parametry nie są niezdefiniowane. Również ten trójskładnikowy operator z nieco skomplikowanymi warunkami może być trudny do odczytania dla przyszłych opiekunów. Wolałbym następującą składnię:if (typeof a == 'undefined') a = 42
- bez niepotrzebnego przypisania plus trochę łatwiejszy do odczytania.typeof
? Łatwiej byłoby to zrobića === undefined
. Plus w ten sposób dostaniesz błąd referencyjny, jeśli popełnisz błąd w pisowniundefined
zamiast w ciągu.Przypisuje to
delete_after
wartość,delete_after
jeśli nie jest to wartość falsey, w przeciwnym razie przypisuje ciąg"my default here"
. Aby uzyskać więcej informacji, sprawdź ankietę Douga Crockforda na temat języka oraz sekcję Operatory .Takie podejście nie działa, jeśli chcesz przekazać w falsey wartości tj
false
,null
,undefined
,0
lub""
. Jeśli chcesz przekazać wartości falsey , musisz użyć metody z odpowiedzi Toma Rittera .W przypadku wielu parametrów funkcji często przydatne jest zezwolenie konsumentowi na przekazanie argumentów parametrów w obiekcie, a następnie scalenie tych wartości z obiektem zawierającym wartości domyślne dla funkcji
używać
źródło
delete_after
nie otrzymano wyniku boolowskiego wyrażeniadelete_after || "my default value"
?Uważam, że coś takiego jest bardziej zwięzłe i czytelne osobiście.
źródło
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. Korzystanie z globalnej przestrzeni nazw, jak pokazano w tej odpowiedzi, jest przez wielu uważane za złą praktykę. Możesz także rozważyć uruchomienie własnego narzędzia do tego wspólnego zadania (np.util.default(arg, "defaul value")
), Jeśli nie chcesz używać podkreślenia, ale w większości przypadków wcześniej lub później używam podkreślenia, nie ma sensu wymyślać koła.undefined
inną wartością, co spowodowało, że test się nie powiódł.undefined
. Tak więc nadal dobrym pomysłem jest użycietypeof
i'undefined'
.W ECMAScript 6 będziesz w stanie napisać dokładnie to, co masz:
Spowoduje to ustawienie
delete_after
, abyfalse
jeśli to nie jest obecny lubundefined
. Możesz korzystać z funkcji ES6, takich jak ta, dzisiaj z transpilerami, takimi jak Babel .Aby uzyskać więcej informacji, zobacz artykuł MDN .
źródło
Domyślne wartości parametrów
Z ES6 możesz zrobić jeden z najczęstszych idiomów
JavaScript
związanych z ustawieniem wartości domyślnej parametru funkcji. Sposób, w jaki robiliśmy to od lat, powinien wyglądać znajomo:Ten wzór jest najczęściej używany, ale jest niebezpieczny, gdy przekazujemy wartości takie jak
Dlaczego? Ponieważ
0 is falsy
, a więcx || 11 results in 11
, a nie bezpośrednio przekazane w 0. Aby naprawić tę gotcha, niektórzy zamiast tego wypiszą czek bardziej dosłownie:możemy teraz zbadać ładną, pomocną składnię dodaną od dnia,
ES6
aby usprawnić przypisywanie wartości domyślnych do brakujących argumentów:x = 11
deklaracja funkcji jest bardziej podobnax !== undefined ? x : 11
do znacznie popularniejszego idiomux || 11
Wyrażenia wartości domyślnej
Function
wartości domyślne mogą być czymś więcej niż zwykłymi wartościami, takimi jak 31; mogą być dowolnym prawidłowym wyrażeniem, nawetfunction call
:Jak widać, wyrażenia wartości domyślnych są leniwie oceniane, co oznacza, że są uruchamiane tylko wtedy, gdy są potrzebne - to znaczy, gdy argument parametru jest pominięty lub niezdefiniowany.
Wyrażenie wartości domyślnej może być nawet wywołaniem wyrażenia funkcji wbudowanej - zwykle nazywanym wyrażeniem funkcji natychmiast wywołanej
(IIFE)
:źródło
to rozwiązanie działa dla mnie w js:
źródło
delete_after
jest0
lubnull
? W tych przypadkach nie będzie działać poprawnie.delete_after = delete_after === undefined ? false : delete_after
?Wystarczy użyć jawnego porównania z niezdefiniowanym.
źródło
Zdecydowanie zaleciłbym szczególną ostrożność podczas używania domyślnych wartości parametrów w javascript. To często powoduje błędy, gdy używany w połączeniu z funkcja wyższego rzędu, takich jak
forEach
,map
ireduce
. Weźmy na przykład następujący wiersz kodu:parseInt ma opcjonalną
function parseInt(s, [
podstawkę drugiego parametru,=10])
ale wywołania mapparseInt
z trzema argumentami: ( element , indeks i tablica ).Sugeruję oddzielenie wymaganych parametrów od argumentów o wartości opcjonalnej / domyślnej. Jeśli twoja funkcja przyjmuje 1,2 lub 3 wymagane parametry, dla których żadna wartość domyślna nie ma sensu, nadaj im parametry pozycyjne dla funkcji, wszelkie parametry opcjonalne powinny występować jako nazwane atrybuty pojedynczego obiektu. Jeśli twoja funkcja zajmuje 4 lub więcej, być może sensowniej jest podać wszystkie argumenty za pomocą atrybutów parametru pojedynczego obiektu.
W twoim przypadku proponuję napisać funkcję DeleteFile takiego: ( edytowane za
instead
„s komentarzach ) ...Uruchomienie powyższego fragmentu ilustruje niebezpieczeństwa kryjące się za domyślnymi wartościami argumentów dla nieużywanych parametrów.
źródło
typeof deleteAfter === 'bool'
i w przeciwnym razie wyrzucić wyjątek. Dodatkowo w przypadku korzystania z metod takich jak map / foreach itp. Należy ich używać ostrożnie i łączyć wywoływane funkcje z funkcją anonimową.['1', '2', '3'].map((value) => {read_file(value);})
get
metody lodash, aby pobrać deleteAfter. Zgłaszanie wyjątku, jeślitypeof 'deleteAfter' !== 'bool'
może być również dobrym rozsądnym środkiem. Nie lubię projektować metod, które wymagają od osoby dzwoniącej „zachowania ostrożności”. Ostrożność jest obowiązkiem funkcji, a nie osoby dzwoniącej. Końcowe zachowanie powinno być zgodne z zasadą najmniejszego zaskoczenia.Jako aktualizacja ... za pomocą ECMAScript 6 możesz NAPRAWDĘ ustawić domyślne wartości w deklaracjach parametrów funkcji, takie jak:
Według odniesienia - http://es6-features.org/#DefaultParameterValues
źródło
Będąc od dawna programistą C ++ (debiutantem w tworzeniu stron internetowych :)), kiedy po raz pierwszy zetknąłem się z tą sytuacją, wykonałem przypisanie parametrów w definicji funkcji, jak wspomniano w pytaniu, jak następuje.
Ale uwaga, że nie działa konsekwentnie w różnych przeglądarkach. Dla mnie działało to na Chrome na moim pulpicie, ale nie działało na Chrome na Androidzie. Bezpieczniejszą opcją, jak wspomniano powyżej, jest -
Zamiarem tej odpowiedzi nie jest powtórzenie tych samych rozwiązań, o czym inni już wspominali, ale poinformowanie, że przypisanie parametrów w definicji funkcji może działać w niektórych przeglądarkach, ale nie należy na niej polegać.
źródło
function myfunc(a,b=10)
jest składnia ES6, w innych odpowiedziach znajdują się łącza do tabel zgodności.Wszystkim zainteresowanym działaniem kodu w Microsoft Edge nie używaj wartości domyślnych w parametrach funkcji.
W tym przykładzie Edge zgłosi błąd „Oczekiwanie”) „”
Aby obejść ten problem, użyj
Od 08 sierpnia 2016 r. Jest to nadal problem
źródło
Zgodnie ze składnią
możesz zdefiniować domyślną wartość parametrów formalnych. a także sprawdź niezdefiniowaną wartość za pomocą funkcji typeof .
źródło
źródło
Użyj tego, jeśli chcesz użyć najnowszej
ECMA6
składni:To się nazywa
default function parameters
. Pozwala na zainicjowanie parametrów formalnych wartościami domyślnymi, jeśli nie zostanie przekazana żadna wartość lub niezdefiniowana. UWAGA : Nie będzie działać z przeglądarką Internet Explorer lub starszymi przeglądarkami.Aby uzyskać maksymalną możliwą kompatybilność, użyj tego:
Obie funkcje zachowują się dokładnie tak samo, jak każdy z tych przykładów opiera się na fakcie, że zmienna parametru będzie działać,
undefined
jeśli nie zostanie przekazana żadna wartość parametru podczas wywoływania tej funkcji.źródło
ES6: Jak już wspomniano w większości odpowiedzi, w ES6 można po prostu zainicjować parametr wraz z wartością.
ES5: Większość z podanych odpowiedzi nie są wystarczająco dobre dla mnie, bo zdarzają się sytuacje, w których może mam do przekazania wartości falsey takie jak
0
,null
aundefined
do funkcji. Aby ustalić, czy parametr jest niezdefiniowany, ponieważ jest to wartość, którą podałem zamiast niezdefiniowanej, ponieważ w ogóle nie został zdefiniowany, robię to:źródło
Tutaj foo () jest funkcją, która ma parametr o nazwie argValue. Jeśli nie podamy tutaj niczego w wywołaniu funkcji, wówczas zostanie wywołana funkcja throwIfNoValue (), a zwrócony wynik zostanie przypisany do jedynego argumentu argValue. W ten sposób można użyć wywołania funkcji jako parametru domyślnego. Co czyni kod bardziej uproszczonym i czytelnym.
Ten przykład został zaczerpnięty stąd
źródło
Jeśli używasz
ES6+
, możesz ustawić parametry domyślne w następujący sposób:Jeśli potrzebujesz
ES5
składni, możesz to zrobić w następujący sposób:W powyższej składni
OR
używany jest operator.OR
Operatora zawsze zwraca pierwszą wartość, jeśli to może być przekształcony wtrue
jeśli nie zwraca wartość righthandside. Gdy funkcja jest wywoływana bez odpowiedniego argumentu, zmienna parametru (bar
w naszym przykładzie) jest ustawianaundefined
przez silnik JS.undefined
Następnie jest konwertowany na false, a zatemOR
operator zwraca wartość 0.źródło
Tak, używanie domyślnych parametrów jest w pełni obsługiwane w ES6 :
lub
ale wcześniej w ES5 można to łatwo zrobić:
Co oznacza, że jeśli wartość tam jest, użyj wartości, w przeciwnym razie użyj drugiej wartości po
||
operacji, która robi to samo ...Uwaga: istnieje również duża różnica między nimi, jeśli przekażesz wartość do ES6, nawet wartość falsy, która zostanie zastąpiona nową wartością, coś w stylu
null
lub""
... ale tylko ES5 zostanie zastąpiona, jeśli tylko przekazana wartość jest prawdą, ponieważ sposób||
działania ...źródło
Jeśli z jakiegoś powodu jesteś nie na ES6 i są przy użyciu
lodash
o to sposób zwięzły domyślnych parametrów funkcji za pomocą_.defaultTo
metody:Które ustawią wartość domyślną, jeśli bieżąca wartość to NaN , zero lub niezdefiniowana
źródło
Sounds of Future
W przyszłości będziesz mógł „przenosić” jeden obiekt na inny (obecnie od 2019 r. NIEobsługiwany przez Edge !) - demonstracja, w jaki sposób używać tego obiektu do ładnych domyślnych opcji niezależnie od kolejności:
Odwołanie do MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
... tymczasem tym, co obsługuje Edge DOES, jest Object.assign () (IE nie, ale naprawdę mam nadzieję, że możemy zostawić IE :)
Podobnie możesz zrobić
EDIT: W związku z uwagami dotyczącymi
const
opcji - problem z użyciem opcji stała w pozostałej części funkcji jest faktycznie nie że nie można tego zrobić, to po prostu, że nie można użyć zmiennej stałej we własnej deklaracji - trzeba aby dopasować nazewnictwo wejściowe do czegoś podobnegoźródło
function(opt){ const opt = /*some merging*/; }
? To na pewno nie zadziała, ponieważ użyjeszconst
zmiennej, zanim zostanie zadeklarowana - będziesz musiał dostosować -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
Aby tylko zaprezentować moje umiejętności (lol), powyższą funkcję można napisać nawet bez nazwanych argumentów, jak poniżej:
ES5 i wyżej
ES6 i wyżej
źródło
Poniższy kod może działać w tej sytuacji, w tym ECMAScript 6 (ES6), a także we wcześniejszych wersjach.
ponieważ wartość domyślna w językach działa, gdy wartość parametru funkcji jest pomijana podczas wywoływania, w JavaScript jest ona przypisana do niezdefiniowanej . To podejście nie wygląda atrakcyjnie programowo, ale ma kompatybilność wsteczną .
źródło
Tak, jest to określane jako parametr domyślny
Domyślne parametry funkcji pozwalają na zainicjowanie parametrów formalnych wartościami domyślnymi, jeśli nie zostanie przekazana żadna wartość lub niezdefiniowana.
Składnia:
Opis:
Parametry funkcji są domyślnie niezdefiniowane Jednak w sytuacjach przydatne może być ustawienie innej wartości domyślnej. Tutaj mogą pomóc parametry domyślne.
W przeszłości ogólną strategią ustawiania wartości domyślnych było testowanie wartości parametrów w treści funkcji i przypisywanie wartości, jeśli są niezdefiniowane. Jeśli w wywołaniu nie podano żadnej wartości, jej wartość byłaby niezdefiniowana. Trzeba ustawić kontrolę warunkową, aby upewnić się, że parametr nie jest niezdefiniowany
Przy domyślnych parametrach w ES2015 sprawdzenie w ciele funkcji nie jest już konieczne. Teraz możesz po prostu umieścić wartość domyślną w nagłówku funkcji.
Przykład różnic:
Różne przykłady składni:
Dopełnianie niezdefiniowane a inne wartości fałszowania:
Nawet jeśli wartość jest jawnie ustawiona podczas wywoływania, wartość argumentu num jest wartością domyślną.
Oceniane w czasie połączenia:
Domyślny argument jest oceniany w czasie wywołania, więc w przeciwieństwie do niektórych innych języków, przy każdym wywołaniu funkcji tworzony jest nowy obiekt.
Parametry domyślne są dostępne dla późniejszych parametrów domyślnych:
Napotkane już parametry są dostępne dla późniejszych parametrów domyślnych
Funkcje zdefiniowane w treści funkcji:
Wprowadzono w Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Do funkcji zadeklarowanych w treści funkcji nie można odwoływać się do parametrów domyślnych i zgłaszać błąd ReferenceError (obecnie TypeError w SpiderMonkey, patrz błąd 1022967). Domyślne parametry są zawsze wykonywane jako pierwsze, następnie deklaracje funkcji wewnątrz treści funkcji.
Parametry bez wartości domyślnych po parametrach domyślnych:
Przed Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2) następujący kod spowodował błąd SyntaxError. Zostało to naprawione w błędzie 777060 i działa zgodnie z oczekiwaniami w późniejszych wersjach. Parametry są nadal ustawiane od lewej do prawej, zastępując parametry domyślne, nawet jeśli istnieją późniejsze parametry bez wartości domyślnych.
Zniszczony parametr z domyślnym przypisaniem wartości:
Przypisania wartości domyślnej można użyć z notacją przypisania niszczenia
źródło
Innym podejściem do ustawiania domyślnych parametrów jest użycie mapy obiektów argumentów zamiast argumentów bezpośrednio. Na przykład,
W ten sposób można łatwo rozszerzyć argumenty i nie martwić się o niedopasowanie długości argumentów.
źródło
Odpowiedź brzmi tak. W rzeczywistości istnieje wiele języków, które obsługują parametry domyślne. Python jest jednym z nich:
Mimo że jest to kod Pythona 3 z powodu nawiasów, domyślne parametry w funkcjach również działają w JS.
Na przykład w twoim przypadku:
Ale czasami tak naprawdę nie potrzebujesz parametrów domyślnych.
Możesz po prostu zdefiniować zmienną zaraz po uruchomieniu funkcji, tak jak to:
W obu moich przykładach zwraca to samo. Ale czasami mogą się przydać, jak w bardzo zaawansowanych projektach.
Podsumowując, w JS można zastosować domyślne wartości parametrów. Ale jest to prawie to samo, co definiowanie zmiennej zaraz po uruchomieniu funkcji. Czasami jednak są nadal bardzo przydatne. Jak można zauważyć, domyślne wartości parametrów zajmują o 1 linię kodu mniej niż standardowy sposób definiowania parametru zaraz po uruchomieniu funkcji.
EDYCJA: I to jest bardzo ważne! To nie będziedziałać w IE. Zobacz dokumentację . Tak więc w IE musisz użyć metody „definiuj zmienną na początku funkcji”. Domyślne parametry nie będą działać w IE.
źródło
Tak, to zadziała w JavaScript. Możesz także to zrobić:
źródło