Was ist die JavaScript-Konvention für keine Operation? Wie ein Python- pass
Befehl.
- Eine Option ist einfach eine leere Funktion:
function() {}
- jQuery bietet an
$.noop()
, die einfach die obige leere Funktion aufruft. - Ist es akzeptabel, einfach einen Wert von
false
oder einzugeben0
?
Im Kontext ... all dies funktioniert ohne einen Fehler in Chrome auszulösen:
var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;
EDIT: Viele Leute antworteten mit: "Tu das nicht! Ändere die Codestruktur!" Dies erinnert mich an einen Beitrag, in dem jemand gefragt hat, wie man den Browser schnüffelt. Er erhielt eine Flut von Posts mit der Aufschrift "TUN SIE DAS NICHT! ES IST BÖSE", aber niemand sagte ihm, wie man am Browser schnüffelt . Dies ist keine Codeüberprüfung. Stellen Sie sich vor, Sie haben es mit Legacy-Code zu tun, der nicht geändert werden kann, und ohne eine übergebene Funktion wird ein Fehler ausgegeben. Oder einfach, so will es der Kunde und er bezahlt mich . Beantworten Sie daher respektvoll die Frage : Wie kann eine Funktion "keine Operation" in JavaScript am besten angegeben werden?
EDIT2: Wie wäre es mit einem davon?
true;
false;
0;
1;
null;
quelle
0
ist effektiv besser (oder schlechter). Ich würde sagen, das Richtige ist, esif (a === 1) doSomething();
nicht zu verwenden,? :
wenn es keinen Sinn ergibt.if (statement) action; else ;
false
oder0
wird funktionieren;null
ist eine gute Möglichkeit, No-Op auszudrücken.Antworten:
Um die ursprüngliche Frage zu beantworten, ist Function.prototype die eleganteste und sauberste Implementierung einer Noop-Funktion in reinem Javascript (wie auch hier erläutert ) . Das ist weil:
Obwohl dies ein "echtes Noop" ist, da die meisten Browser anscheinend nichts tun, um das auf diese Weise definierte Noop auszuführen (und damit CPU-Zyklen zu sparen), kann dies zu Leistungsproblemen führen (wie auch von anderen in Kommentaren oder in erwähnt) Andere Antwort).
Allerdings können Sie leicht Ihre eigene Noop-Funktion definieren, und tatsächlich bieten viele Bibliotheken und Frameworks auch Noop-Funktionen. Nachfolgend einige Beispiele:
Hier ist eine alphabetische Liste verschiedener Implementierungen von Noop-Funktionen (oder verwandten Diskussionen oder Google-Suchen):
AngularJS 1.x , Angular 2+ (scheint keine native Implementierung zu haben - verwenden Sie Ihre eigene wie oben gezeigt), Ember , jQuery , Lodash , NodeJS , Ramda , React (scheint keine native Implementierung zu haben - verwenden Sie Ihre eigene wie oben gezeigt), RxJS , Unterstrich
BOTTOM LINE : Obwohl Function.prototype eine elegante Möglichkeit ist, ein Noop in Javascript auszudrücken, kann es im Zusammenhang mit seiner Verwendung zu Leistungsproblemen kommen. Sie können also Ihre eigenen definieren und verwenden (wie oben gezeigt) oder eine verwenden, die von der Bibliothek / dem Framework definiert wird, die Sie möglicherweise in Ihrem Code verwenden.
quelle
Function.prototype()
wenn Sie das Timeout nicht benötigen und möchten, dass es sofort ausgeführt wird.setTimeout(Function(), 10000);
(( )=>{};)
technisch Pure JS und viel kürzer alsfunction () {}
aber genau gleichwertig.Das prägnanteste und performanteste Noop ist eine leere Pfeilfunktion :
()=>{}
.Pfeilfunktionen funktionieren nativ in allen Browsern außer IE (es gibt eine Babel-Transformation, wenn Sie müssen):
()=>{}
vs.Function.Prototype
()=>{}
ist 87% schneller alsFunction.prototype
in Chrome 67.()=>{}
ist 25% schneller alsFunction.prototype
in Firefox 60.()=>{}
ist 85% schneller alsFunction.prototype
in Edge (15.06.2008) .()=>{}
ist 65% weniger Code alsFunction.prototype
.Der folgende Test wird mithilfe der Pfeilfunktion aufgeheizt, um eine Verzerrung zu
Function.prototype
erzielen. Die Pfeilfunktion ist jedoch der klare Gewinner:quelle
Function.prototype
ist drastisch langsamer, aber keine der anderen Optionen hat einen eindeutigen Vorteil._=>{}
ist ein Zeichen weniger und macht das Gleiche._=>{}
hat einen einzelnen Parameter. Wenn jemand TypeScript mit einer relativ strengen Konfiguration verwendet, wird dies nicht kompiliert. Wenn Sie es aufrufen, wird Ihre IDE Ihnen wahrscheinlich mitteilen, dass es einen einzelnen Parameter akzeptiert, der von einem beliebigen Typ sein kann (sowohl JavaScript als auch insbesondere TypeScript in vscode).Was immer Sie hier erreichen wollen, ist falsch. Ternäre Ausdrücke sollen nicht als vollständige Aussage verwendet nur als Ausdruck. Die Antwort auf Ihre Frage lautet daher:
Keiner Ihrer Vorschläge, stattdessen:
dann ist der Code leicht verständlich, lesbar und so effizient wie möglich.
Warum es schwieriger machen, wenn es einfach sein kann?
bearbeiten:
Du vermisst meinen Standpunkt. Bei alledem geht es um den ternären Ausdruck
x ? y : z
.In höheren Sprachen wie Javascript ist ein Befehl no operation jedoch nicht sinnvoll.
Es wird normalerweise in untergeordneten Sprachen wie Assembly oder C verwendet, um den Prozessor zu veranlassen, für Timing-Zwecke nichts für einen Befehl zu tun.
In JS, ob Sie tun
0;
,null;
,function () {};
oder eine leere Aussage, gibt es große Chancen , dass es durch die interpretor ignoriert wird, wenn er sie liest, aber bevor es, so dass am Ende interpretiert wird, müssen Sie nur Ihr Programm machen sein langsamer geladen durch eine wirklich winzige Zeitspanne. Nota Bene : Ich gehe davon aus, da ich an keinem weit verbreiteten JS-Interpreter beteiligt bin und es Chancen gibt, dass jeder Interpreter seine eigene Strategie hat.Wenn Sie etwas Komplizierteres wie
$.noop()
oder verwendenvar foo = function () {}; foo()
, führt der Interpreter möglicherweise einen nicht nützlichen Funktionsaufruf aus, der einige Bytes Ihres Funktionsstapels und einige Zyklen beeinträchtigt.Der einzige Grund, warum ich eine Funktion sehe, wie
$.noop()
sie existieren würde, wäre, einer Ereignisfunktion, die eine Ausnahme auslösen würde, wenn sie diesen Rückruf nicht aufrufen kann, weiterhin eine Rückruffunktion geben zu können. Aber dann ist es notwendigerweise eine Funktion, die Sie geben müssen, und geben Sie ihr dienoop
ist eine gute Idee Namen damit Sie Ihren Lesern (und das können Sie in 6 Monaten sein) sagen, dass Sie absichtlich eine leere Funktion geben.Am Ende gibt es keine "minderwertige" oder "überlegene" Codestruktur. Sie haben entweder Recht oder Unrecht in der Art und Weise, wie Sie Ihre Werkzeuge verwenden. Die Verwendung eines Ternärs für Ihr Beispiel ist wie die Verwendung eines Hammers, wenn Sie schrauben möchten. Es wird funktionieren, aber Sie sind sich nicht sicher, ob Sie etwas an diese Schraube hängen können.
Was als "minderwertig" oder "überlegen" angesehen werden kann, ist der Algorithmus und die Ideen, die Sie in Ihren Code einfügen. Aber das ist eine andere Sache.
quelle
Ich denke, jQuery
noop()
soll hauptsächlich verhindern, dass Code abstürzt, indem eine Standardfunktion bereitgestellt wird, wenn die angeforderte nicht verfügbar ist. Unter Berücksichtigung des folgenden Codebeispiels$.noop
wird beispielsweise ausgewählt, wennfakeFunction
es nicht definiert ist, um zu verhindern, dass der nächste Aufruffn
von abstürzt:Dann
noop()
können Speicher sparen , indem die Vermeidung der gleichen leeren Funktion mehrere Male überall in Ihrem Code zu schreiben. Ist übrigens$.noop
etwas kürzer alsfunction(){}
(6 Bytes pro Token gespeichert). Es gibt also keine Beziehung zwischen Ihrem Code und dem leeren Funktionsmuster. Verwenden Sienull
,false
oder0
wenn Sie in Ihrem Fall mögen, wird es keine Nebenwirkung sein. Darüber hinaus ist es erwähnenswert, dass dieser Code ...... ist völlig nutzlos, da Sie die Funktion niemals aufrufen werden, und diese ...
... ist noch nutzloser, da Sie eine leere Funktion aufrufen, die genau das gleiche ist wie ...
Ersetzen wir den ternären Ausdruck durch eine
if
Aussage, um zu sehen, wie nutzlos er ist:Sie könnten einfach schreiben:
Oder noch kürzer:
Um Ihre Frage endgültig zu beantworten, denke ich, dass eine "konventionelle No-Operation" diejenige ist, die niemals geschrieben wird.
quelle
mypromise.then($.noop, myErrorhandler);
Ich benutze:
So testen Sie die Ausführungszeit dieses Laufs wie folgt:
Ergebnis: Marke: 0,000ms
Die Verwendung
Boolean( 10 > 9)
kann auf einfach reduziert werden,( 10 > 9)
was zurückgibttrue
. Die Idee, einen einzelnen Operanden zu verwenden, den ich voll und ganz erwartet hatte,(0);
würde zurückkehrenfalse
, aber das Argument wird einfach zurückgegeben, wie durch Ausführen dieses Tests an der Konsole überprüft werden kann.quelle
argument 0 is not a function
noop
sollte eine Funktion sein, die mit demundefined
Ergebnis ausgewertet wird .function(){}
eine Lösung vorschlägt . Anruf(0)()
wird verursachenTypeError: 0 is not a function
var a = (0);
. Ein No-Op sollte den Speicher nicht ändern, und Ihr Zuweisungsbeispiel macht genau das. Das(0)
allein kann als nutzloses No-Op angesehen werden (es gibt unendlich viele davon in JavaScript, daher gibt es nichts, was Ihr Beispiel hier besonders macht).Es gibt absolut kein Problem oder Leistungseinbußen bei der Verwendung von
Function.prototype
Over() => {}
.Der Hauptvorteil
Function.prototype
besteht darin, eine Singleton-Funktion zu haben, anstatt jedes Mal eine neue anonyme Funktion neu zu definieren. Es ist besonders wichtig, ein No-Op wieFunction.prototype
beim Definieren von Standardwerten und beim Speichern zu verwenden, da Sie einen konsistenten Objektzeiger erhalten, der sich nie ändert.Den Grund empfehle ich
Function.prototype
eher als,Function
ist, dass sie nicht gleich sind:Ebenfalls, Benchmarks aus anderen Antworten sind irreführend . Tatsächlich ist
Function.prototype
die Leistung schneller als() => {}
je nachdem, wie Sie den Benchmark schreiben und ausführen:Sie können JS-Benchmarks nicht vertrauen. << Speziell Benchmarks für diese Frage aufrufen.
Gestalten Sie Ihren Code nicht anhand von Benchmarks. Tun Sie alles, was wartbar ist, und lassen Sie den Dolmetscher herausfinden, wie er langfristig optimieren kann.
quelle