691 Stimmen

Was ist der Operator "Doppelte Tilde" (~~) in JavaScript?

Ich sehe dies in einigen Codes, und ich habe keine Ahnung, was es bewirkt:

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?

911voto

ghoppe Punkte 20610

Das ~~ ist ein doppelter bitweiser NOT-Operator.

Es wird verwendet als schnellerer Ersatz für Math.floor() para positiv Zahlen. Sie liefert nicht das gleiche Ergebnis wie Math.floor() für negative Zahlen, da es nur den Teil nach dem Komma abschneidet (siehe andere Antworten für Beispiele).

222voto

Guffa Punkte 663241

Er verbirgt die Absicht des Codes.

Es handelt sich um zwei einzelne Tilde-Operatoren, d. h. es wird zweimal eine bitweise Ergänzung (bitweise nicht) durchgeführt. Die Operationen heben sich gegenseitig auf, so dass die einzige verbleibende Auswirkung die Umwandlung ist, die vor der Anwendung des ersten Operators erfolgt, d. h. die Umwandlung des Wertes in eine ganze Zahl.

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. Wenn Sie keinen Code haben, der wirklich optimiert werden muss, sollten Sie einen Code verwenden, der beschreibt, was er tut, anstatt einen Code, der einen Nebeneffekt einer Nicht-Operation verwendet.

Update 2011-08:

Mit der Optimierung der JavaScript-Engine in Browsern ändert sich die Leistung für Operatoren und Funktionen. Bei aktuellen Browsern ist die Verwendung von ~~ anstelle von Math.floor ist in manchen Browsern etwas schneller und in manchen Browsern überhaupt nicht schneller. Wenn Sie wirklich das gewisse Extra an Leistung benötigen, müssen Sie für jeden Browser einen anderen optimierten Code schreiben.

Siehe: Tilde vs. Boden

174voto

bowsersenior Punkte 12276
~(5.5)   // => -6
~(-6)    // => 5
~~5.5    // => 5  (same as Math.trunc(5.5) and Math.floor(5.5))
~~(-5.5) // => -5 (same as Math.trunc(-5.5) but NOT the same as Math.floor(-5.5), which would give -6 )

Für weitere Informationen siehe:

25voto

Jason Stackhouse Punkte 1608

Der Unterschied ist ganz einfach:

Lange Fassung

Wenn Sie eine bessere Lesbarkeit wünschen, verwenden Sie Math.floor . Wenn Sie es jedoch minimieren möchten, verwenden Sie die Tilde ~~ .

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

Kurzfassung

~~ kürzer ist/weniger Platz einnimmt. Math.floor verbessert die Lesbarkeit. Manchmal ist Tilde schneller, manchmal Math.floor ist schneller, aber es ist nicht spürbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X