it-swarm.com.de

Was ist der Operator "double tilde" (~~) in JavaScript?

Ich sehe das in irgendeinem Code und ich habe keine Ahnung, was es tut:

var jdn = function(y, m, d) {
  var tmp = (m <= 2 ? -1 : 0);
  return ~~((1461 * (y + 4800 + tmp)) / 4) + 
         ~~((367 * (m - 2 - 12 * tmp)) / 12) - 
         ~~((3 * ((y + 4900 + tmp) / 100)) / 4) + 
         d - 2483620;
};

Was ist das ~~ Betreiber tun?

506
jismo

Das ~~ Ist ein doppelter NICHT bitweiser Operator.

Es wird als schnellerer Ersatz für Math.floor() verwendet.

645
ghoppe

Es verbirgt die Absicht des Codes.

Es sind zwei einzelne Tilde-Operatoren, daher wird eine bitweise Ergänzung (nicht bitweise) zweimal ausgeführt. Die Operationen nehmen sich gegenseitig heraus, so dass der einzige verbleibende Effekt die Konvertierung ist, die durchgeführt wird, bevor der erste Operator angewendet wird, d. H. Das Konvertieren des Werts in eine Ganzzahl.

Einige verwenden es als schnellere Alternative zu Math.floor, aber der Geschwindigkeitsunterschied ist nicht so dramatisch, und in den meisten Fällen handelt es sich nur um eine Mikrooptimierung. Sofern Sie keinen Code haben, der wirklich optimiert werden muss, sollten Sie Code verwenden, der die Funktionsweise des Codes beschreibt, anstatt Code, der den Nebeneffekt einer Nichtoperation verwendet.

Update 2011-08:

Mit der Optimierung der JavaScript-Engine in Browsern ändert sich die Leistung für Operatoren und Funktionen. Mit aktuellen Browsern mit ~~ anstatt Math.floor ist in einigen Browsern etwas schneller und in einigen Browsern überhaupt nicht schneller. Wenn Sie wirklich mehr Leistung benötigen, müssen Sie für jeden Browser einen anderen optimierten Code schreiben.

Siehe: Tilde vs Boden

160
Guffa
~(5.5)   // => -6
~(-6)    // => 5
~~5.5    // => 5  (same as Math.floor(5.5))
~~(-5.5) // => -5 (NOT the same as Math.floor(-5.5), which would give -6 )

Weitere Informationen finden Sie unter:

119
bowsersenior

Der Unterschied ist sehr einfach:

Lange Version

Wenn Sie eine bessere Lesbarkeit wünschen, verwenden Sie Math.floor. Aber wenn du es minimieren willst, benutze tilde ~~.

Es gibt viele Quellen im Internet, die Math.floor ist schneller, aber manchmal ~~. Ich würde nicht empfehlen, über Geschwindigkeit nachzudenken, da dies beim Ausführen des Codes nicht bemerkt wird. Vielleicht in Tests usw., aber kein Mensch kann hier einen Unterschied sehen. Was schneller wäre, wäre ~~ für eine schnellere Ladezeit.

Kurzfassung

~~ ist kürzer/nimmt weniger Platz ein. Math.floor verbessert die Lesbarkeit. Mal ist die Tilde schneller, mal Math.floor ist schneller, fällt aber nicht auf.

19