Jaka jest konwencja JavaScript dotycząca braku operacji? Jak pass
polecenie w Pythonie .
- Jedną z opcji jest po prostu pusta funkcja:
function() {}
- Oferty jQuery
$.noop()
, które po prostu wywołują pustą funkcję powyżej. - Czy dopuszczalne jest po prostu wpisanie wartości
false
lub0
?
W kontekście ... wszystkie te działają bez zgłaszania błędu w Chrome:
var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;
EDYCJA: Wiele osób odpowiedziało „nie rób tego! Zmień strukturę kodu!” To przypomina mi post, w którym ktoś zapytał, jak powąchać przeglądarkę. Otrzymał lawinę postów z napisem „NIE ROBIĆ TEGO! TO ZŁO”, ale nikt nie powiedział mu, jak wąchać przeglądarkę . To nie jest przegląd kodu. Wyobraź sobie, że masz do czynienia ze starszym kodem, którego nie można zmienić i bez przekazania jakiejś funkcji spowoduje wyświetlenie błędu. Lub po prostu klient tego chce i płacą mi . Tak więc, z szacunkiem, odpowiedz na pytanie : Jaki jest najlepszy sposób określenia funkcji „brak operacji” w JavaScript?
EDIT2: A co z jednym z nich?
true;
false;
0;
1;
null;
źródło
0
jest w rzeczywistości lepsza (ani gorsza). Powiedziałbym, że właściwą rzeczą jestif (a === 1) doSomething();
i nie używać,? :
gdy nie ma to sensu.if (statement) action; else ;
false
lub0
będzie działać;null
to dobry sposób na wyrażenie zgody na nie.Odpowiedzi:
Odpowiadając na pierwotne pytanie, najbardziej elegancką i zgrabną implementacją funkcji noop w czystym Javascript (jak również tutaj omówiono ) jest Function.prototype . To dlatego, że:
Chociaż jest to „prawdziwy noop”, ponieważ większość przeglądarek wydaje się nie robić nic, aby wykonać zdefiniowane w ten sposób noop (a tym samym oszczędzać cykle procesora), mogą być z tym związane pewne problemy z wydajnością (o czym wspominają również inni w komentarzach lub w inne odpowiedzi).
Jednak w związku z tym można łatwo zdefiniować własną funkcję noop i, w rzeczywistości, wiele bibliotek i frameworków również udostępnia funkcje noop. Poniżej kilka przykładów:
Oto alfabetyczna lista różnych implementacji funkcji noop (lub powiązanych dyskusji lub wyszukiwań w Google):
AngularJS 1.x , Angular 2+ (wygląda na to, że nie ma natywnej implementacji - użyj własnej, jak pokazano powyżej), Ember , jQuery , Lodash , NodeJS , Ramda , React (nie wydaje się mieć natywnej implementacji - użyj własnej jak pokazano powyżej), RxJS , podkreślenie
BOTTOM LINE : Chociaż Function.prototype to elegancki sposób wyrażania noop w JavaScript, mogą jednak wystąpić pewne problemy z wydajnością związane z jego użyciem. Możesz więc zdefiniować i użyć własnego (jak pokazano powyżej) lub użyć takiego zdefiniowanego przez bibliotekę / framework, którego możesz używać w swoim kodzie.
źródło
Function.prototype()
jeśli nie potrzebujesz limitu czasu i chcesz, aby został wykonany od razu.setTimeout(Function(), 10000);
(( )=>{};)
technicznie Czysty JS i znacznie krótszy niż,function () {}
ale dokładnie równoważny.Najbardziej zwięzły i wydajnych noop jest funkcja pusta strzałka :
()=>{}
.Funkcje strzałek działają natywnie we wszystkich przeglądarkach poza IE ( jeśli musisz, istnieje transformacja Babel ):
()=>{}
vs.Function.Prototype
()=>{}
jest 87% szybszy niżFunction.prototype
w Chrome 67.()=>{}
jest o 25% szybszy niżFunction.prototype
w przeglądarce Firefox 60.()=>{}
jest 85% szybszy niżFunction.prototype
w Edge (15.06.2018) .()=>{}
to 65% mniej kodu niżFunction.prototype
.Poniższy test rozgrzewa się, używając funkcji strzałek, aby uzyskać odchylenie
Function.prototype
, ale funkcja strzałka jest wyraźnym zwycięzcą:źródło
Function.prototype
jest drastycznie wolniejszy, ale żadna z pozostałych opcji nie ma zdecydowanej przewagi._=>{}
jest o jeden znak mniej i robi to samo._=>{}
ma jeden parametr. Jeśli ktoś używa TypeScript z dość ścisłą konfiguracją, to się nie skompiluje. Jeśli to nazwiesz, twoje IDE prawdopodobnie powie, że akceptuje pojedynczy parametr, który może być dowolnego typu (zarówno JavaScript, jak i TypeScript w vscode).cokolwiek tutaj osiągasz, jest złe. Wyrażeń trójskładnikowych nie należy używać jako pełnego oświadczenia, tylko w wyrażeniu, więc odpowiedź na twoje pytanie brzmi:
żadna z twoich sugestii, zamiast tego zrób:
wtedy kod jest łatwo zrozumiały, czytelny i tak efektywny, jak to tylko możliwe.
Po co to utrudniać, skoro może to być proste?
edytować:
Nie rozumiesz, o co mi chodzi. Wszystko powyżej dotyczy wyrażenia trójskładnikowego
x ? y : z
.Jednak polecenie no operation nie ma sensu w językach wyższego poziomu, takich jak Javascript.
Jest zwykle używany w językach niższego poziomu, takich jak asembler lub C, jako sposób, aby procesor nie robił nic dla jednej instrukcji dla celów synchronizacji.
W JS, czy to zrobić
0;
,null;
,function () {};
lub pustym stwierdzeniem, istnieją duże szanse, że zostanie ona zignorowana przez tłumacza, gdy czyta je, ale zanim to dostaje interpretowane, więc w końcu, będziesz po prostu uczynić Twój program będzie ładowany wolniej przez naprawdę niewielki czas. Nota Bene : Zakładam to, ponieważ nie jestem zaangażowany w żaden powszechnie używany interpreter JS i są szanse, że każdy interpreter ma swoją własną strategię.W przypadku, gdy używasz czegoś bardziej skomplikowanego, na przykład
$.noop()
lubvar foo = function () {}; foo()
, interpreter może wykonać nieużyteczne wywołanie funkcji, które w końcu zepsuje kilka bajtów twojego stosu funkcji i kilka cykli.Jedynym powodem, dla którego widzę taką funkcję, jak
$.noop()
istniałaby, byłoby to, że mógłbym nadal udostępniać funkcję zwrotną jakiejś funkcji zdarzenia, która zgłosiłaby wyjątek, gdyby nie mogła wywołać tego wywołania zwrotnego. Ale z konieczności jest to funkcja, którą musisz nadać, a nadanie jejnoop
nazwy jest dobrym pomysłem, więc mówisz swoim czytelnikom (a może to być ty za 6 miesięcy), że celowo dajesz pustą funkcję.Ostatecznie nie ma czegoś takiego jak „gorsza” lub „wyższa” struktura kodu. Masz rację lub mylisz się w sposobie używania narzędzi. Używanie trójskładnika jako przykładu jest jak używanie młotka, gdy chcesz wkręcić. To zadziała, ale nie jesteś pewien, czy możesz coś zawiesić na tej śrubie.
To, co można uznać za „gorsze” lub „lepsze”, to algorytm i pomysły, które umieścisz w swoim kodzie. Ale to inna sprawa.
źródło
Myślę, że jQuery
noop()
ma głównie na celu zapobieganie awariom kodu, zapewniając domyślną funkcję, gdy żądana nie jest dostępna. Na przykład, biorąc pod uwagę następujący przykład kodu,$.noop
jest wybierany, jeślifakeFunction
nie jest zdefiniowany, co zapobiegafn
awarii następnego wywołania funkcji :Następnie
noop()
pozwala zaoszczędzić pamięć, unikając wielokrotnego pisania tej samej pustej funkcji w całym kodzie. Nawiasem mówiąc,$.noop
jest nieco krótszy niżfunction(){}
(6 bajtów zapisanych na token). Tak więc nie ma związku między kodem a pustym wzorcem funkcji. Stosowanienull
,false
lub0
jeśli chcesz, w Twoim przypadku nie będzie efektem ubocznym. Ponadto warto zauważyć, że ten kod ...... jest całkowicie bezużyteczna, ponieważ nigdy nie wywołasz funkcji, a ta ...
... jest jeszcze bardziej bezużyteczny, ponieważ wywołujesz pustą funkcję, która jest dokładnie tym samym, co ...
Zastąpmy wyrażenie trójskładnikowe
if
instrukcją, aby zobaczyć, jak bardzo jest bezużyteczne:Możesz po prostu napisać:
Albo jeszcze krócej:
Aby wreszcie odpowiedzieć na twoje pytanie, myślę, że „konwencjonalna operacja nie” to taka, która nigdy nie została napisana.
źródło
mypromise.then($.noop, myErrorhandler);
Używam:
Aby przetestować czas wykonania tego uruchomienia jako:
wynik: ocena: 0.000ms
Użycie
Boolean( 10 > 9)
można sprowadzić do prostego( 10 > 9)
określenia, które zwracatrue
. Wymyślenie pomysłu użycia pojedynczego operandu, którego w pełni oczekiwałem(0);
, zwrócifalse
, ale po prostu zwraca argument z powrotem, co można przejrzeć, wykonując ten test w konsoli.źródło
argument 0 is not a function
noop
powinno być funkcją oceniającą zundefined
wynikiem.function(){}
jako rozwiązanie. Wezwanie(0)()
spowodujeTypeError: 0 is not a function
var a = (0);
. No-op nie powinien zmieniać pamięci, a przykład przydziału właśnie to robi. Samo(0)
w sobie można uznać za bezużyteczny no-op (w JavaScript jest ich nieskończona liczba, więc nic nie czyni twojego przykładu wyjątkowym).Nie ma absolutnie żadnego problemu ani spadku wydajności w przypadku używania
Function.prototype
ponad() => {}
.Główną zaletą
Function.prototype
jest posiadanie funkcji singleton zamiast ponownego definiowania nowej funkcji anonimowej za każdym razem. Szczególnie ważne jest, abyFunction.prototype
podczas definiowania wartości domyślnych i zapamiętywania używać opcji no-op, ponieważ zapewnia ona spójny wskaźnik obiektu, który nigdy się nie zmienia.Powodem, dla którego
Function.prototype
raczej polecam, a nieFunction
dlatego, że nie są takie same:Również testy porównawcze z innych odpowiedzi są mylące . W rzeczywistości
Function.prototype
działa szybciej niż w() => {}
zależności od tego, jak napiszesz i uruchomisz test porównawczy:Nie można ufać benchmarkom JS .
Nie stylizuj swojego kodu na podstawie testów; zrób wszystko, co możliwe, i pozwól tłumaczowi dowiedzieć się, jak zoptymalizować w dłuższej perspektywie.
źródło