Wydaje się, że istnieje ogromna awersja do tworzenia funkcji w JS. Ta awersja powoduje, że ludzie starają się być sprytni i stosować absurdalne sztuczki, aby utrzymać rzeczy w jednym wierszu, tak jak byłoby w przypadku wywołania funkcji. Oczywiście nazwa funkcji w wywołaniu działa również jako dodatkowa dokumentacja. Nie możemy dołączyć komentarza do podstępnego wyrażenia, ponieważ wtedy pokonałoby to sens robienia tego, dlatego nazywamy to „idiomem js” i nagle jest to zrozumiałe.
Javascript jest bardzo dostępny, większość ludzi nie je specyfikacji tak jak my. Więc nigdy nie zrozumieją, czym są ukryte założenia i skrajne przypadki idiomu.
x = x || 'default_value';
Przeciętny Joe albo tego nie zrozumie, albo zapamiętał, że jest to idiom wartości domyślnej. Oba są szkodliwe, w rzeczywistości to drugie jest jeszcze bardziej szkodliwe. Nie zrozumie tu założeń i przypadkowych przypadków. Nie będzie chciał czytać specyfikacji i nigdy jej nie zrozumieć.
Kiedy patrzę na tego kodu widzę „, czy to null
lub undefined
, a następnie ustawić go do tej wartości domyślnej. Mimo to również w sposób dorozumiany leczyć +0
, -0
, NaN
, false
i ""
jak nie odpowiednich wartości. Będę musiał pamiętać, że 3 miesiące od teraz kiedy to potrzeby zmienić. Prawdopodobnie zapomnę. ”.
Domniemane założenie jest bardzo prawdopodobne, że spowoduje błąd w przyszłości, a gdy twoja baza kodu jest pełna takich sztuczek, nie ma szans, abyś trzymał je wszystkie w głowie, ilekroć zastanawiasz się, co wpłynie na modyfikację. I to jest dla „JS pro”, przeciętny Joe napisałby błąd, nawet gdyby na początku wymagano przyjęcia wartości falsy.
Twój nowy fragment ma bardziej znaną składnię, ale nadal występuje powyższy problem.
Możesz iść z:
function f(x) {
x = valueOrDefault(x, "default_value");
}
Teraz możesz mieć bardzo złożoną logikę do obsługi przypadków brzegowych, a kod klienta nadal wygląda pięknie i czytelnie.
Jak odróżnić zaawansowaną funkcję języka, taką jak przekazanie funkcji jako argumentu lub sprytna sztuczka || "default"
?
Sprytne sztuczki zawsze działają przy pewnych ukrytych założeniach, które można zignorować podczas tworzenia kodu. Nigdy nie będę musiał modyfikować IIFE do czegoś innego, ponieważ zmienił się wymóg, zawsze tam będzie. Może w 2020 roku, kiedy będę mógł używać rzeczywistych modułów, ale tak.
| 0
lub wersja kultowa ~~num
zastosowana do podłogi zakłada dodatnie i 32-bitowe liczby całkowite ze znakiem.
|| "default"
zakłada, że wszystkie wartości fałszowania są takie same, jak nieprzekazanie argumentu.
I tak dalej.