Natknąłem się na tę konstrukcję na przykładzie Angulara i zastanawiam się, dlaczego wybrano tę:
_ => console.log('Not using any parameters');
Rozumiem, że zmienna _ oznacza nie obchodzi / nie jest używana, ale ponieważ jest to jedyna zmienna, istnieje powód, aby preferować użycie _ ponad:
() => console.log('Not using any parameters');
Z pewnością nie może to być o jeden znak mniej do wpisania. Składnia () lepiej oddaje intencję moim zdaniem, a także jest bardziej specyficzna dla typu, ponieważ w przeciwnym razie myślę, że pierwszy przykład powinien wyglądać tak:
(_: any) => console.log('Not using any parameters');
Na wypadek, gdyby miało to znaczenie, był to kontekst, w którym został użyty:
submit(query: string): void {
this.router.navigate(['search'], { queryParams: { query: query } })
.then(_ => this.search());
}
Odpowiedzi:
Powodem, dla którego można użyć tego stylu (i prawdopodobnie dlatego został tutaj użyty) jest to, że
_
jest o jeden znak krótszy niż()
.Opcjonalne nawiasy to ten sam problem ze stylem, co opcjonalne nawiasy klamrowe . Jest to w większości kwestia gustu i stylu kodu, ale w tym przypadku preferowana jest szczegółowość ze względu na spójność.
Podczas gdy funkcje strzałkowe pozwalają na pojedynczy parametr bez nawiasów, jest to niespójne z zerem, pojedynczą zniszczoną, pojedynczą resztą i wieloma parametrami:
Chociaż
is declared but never used
błąd został naprawiony w TypeScript 2.0 dla podkreślonych parametrów,_
może również wyzwalaćunused variable/parameter
ostrzeżenie z lintera lub IDE. To poważny argument przeciwko temu._
może być konwencjonalnie używane dla ignorowanych parametrów (jak już wyjaśniono inną odpowiedź). Chociaż można to uznać za akceptowalne, ten nawyk może powodować konflikt z_
przestrzenią nazw Underscore / Lodash, a także wygląda myląco, gdy istnieje wiele ignorowanych parametrów. Z tego powodu korzystne jest posiadanie odpowiednio nazwanych podkreślonych parametrów (obsługiwanych w TS 2.0), oszczędza również czas na ustalaniu sygnatury funkcji i dlaczego parametry są oznaczane jako ignorowane (jest to sprzeczne z celem_
parametru jako skrótu):Z powodów wymienionych powyżej osobiście
_ => { ... }
uważałbym styl kodu za zły ton, którego należy unikać.źródło
(
zwykle wiąże się z rozszerzeniem)
. Osobiście wolę używaćp
parametru, zastanawiam się też, czy ma to jakiś problem z wydajnościąNie dokładnie.
()
mówi, że funkcja nie oczekuje żadnych argumentów, nie deklaruje żadnych parametrów. Funkcja.length
to 0.Jeśli używasz
_
, wyraźnie stwierdza, że funkcja otrzyma jeden argument, ale nie obchodzi cię to. Funkcja.length
będzie miała wartość 1, co może mieć znaczenie w niektórych frameworkach.Więc z punktu widzenia typu może to być dokładniejsze rozwiązanie (zwłaszcza jeśli nie piszesz tego,
any
ale powiedzmy_: Event
). Jak powiedziałeś, wpisywanie jest o jeden znak mniej, co jest również łatwiejsze do osiągnięcia na niektórych klawiaturach.źródło
_
zmiennych funkcji strzałek s, zastanawiam się, czy jest jakaś różnica w wydajności w porównaniu z używaniem()
Myślę, że
_ =>
jest po prostu używany,() =>
ponieważ_
jest powszechny w innych językach, w których nie można po prostu pomijać parametrów, jak w JS._
jest popularny w Go i jest również używany w Dart, aby wskazać, że parametr jest ignorowany i prawdopodobnie inne, o których nie wiem.źródło
_
prawdopodobnie zostało zapożyczone z języków funkcjonalnych, takich jak ML i Haskell, gdzie jest na długo przed wynalezieniem Pythona (nie mówiąc już o Go, Dart czy TypeScript).Możliwe jest rozróżnienie między tymi dwoma zastosowaniami, a niektóre frameworki używają tego do reprezentowania różnych typów wywołań zwrotnych. Na przykład myślę, że nodes Express Framework używa tego do rozróżnienia typów oprogramowania pośredniego, na przykład programy obsługi błędów używają trzech argumentów, podczas gdy routing używa dwóch.
Takie zróżnicowanie może wyglądać jak na poniższym przykładzie:
źródło
Kiedy pisałem ten post, byłem pod wrażeniem,
_
że jedyny sposób na stworzenie funkcji strzałkowych bez niego()
doprowadził mnie do przekonania, że używanie_
może mieć drobne zalety, ale się myliłem. @Halt potwierdził w komentarzach, że zachowuje się tak jak inne zmienne, nie jest to specjalna konstrukcja językowa.Chcę wspomnieć o jeszcze jednej rzeczy, którą zdałem sobie sprawę z tych funkcji podkreślenia strzałek podczas testowania siebie, o których nigdzie nie wspomniałem. Państwo może używać podkreślenia w funkcji jako parametr , choć prawdopodobnie nie ma zastosowania, ponieważ to ma reprezentować nieużywany parametr. Dla jasności nie polecałbym używania go w ten sposób.
ale może się przydać wiedza o takich rzeczach jak codegolf , wyzwania, w których piszesz najkrótszy kod(okazuje się, że możesz po prostu użyć dowolnego znaku bez()
). Mogę sobie wyobrazić prawdziwe przypadki użycia, w których biblioteki używają tego i trzeba go używać, nawet jeśli nie zamierzały korzystać z tej funkcji.Przykład:
Testowane z konsolą Chrome, wersja 76.0.3809.132 (oficjalna kompilacja) (64-bitowa)
źródło
()
zanim napisałem ten post, pomyślałem, że_
to jedyny sposób, dlatego postanowiłem to wskazać. Mając to na uwadze, okazuje się, że nie jest to nic specjalnego, nawet do gry w golfa, ponieważ można po prostu użyć zwykłej postaci. Lepiej używać po prostu do przestrzegania konwencji, jak powiedziałeś.