JavaScript dreifach größer als

87

Ich habe diese Syntax in einem anderen StackOverflow-Beitrag gesehen und war gespannt, was sie bewirkt:

var len = this.length >>> 0;

Was bedeutet >>>das?

Jey Balachandran
quelle
1
Das ist ein Rechtsschaltoperator, aber warum sollten Sie um Null nach rechts schalten? Ist das eine billige Art zu tun parseInt?
Rocket Hazmat
4
>>>setzt das Vorzeichenbit immer auf Null, auch wenn Sie um Nullbits verschieben.
John Flatness
4
Überprüfen Sie diese Antwort, warum sie in diesem Fall den >>>Operator verwenden: stackoverflow.com/questions/3081987/…
CMS
1
JavaScript Triple Angle Bracket
wprl
Ich habe diese Syntax in developer.mozilla.org/en/docs/Web/JavaScript/Reference/… var length = list.length >>> 0; (der gleiche Anwendungsfall wie Ihr) gesehen
Mars Robertson

Antworten:

49

Das ist ein nicht signierter Rechtsschichtfahrer . Interessanterweise ist es der einzige bitweise Operator , der in JavaScript nicht signiert ist .

Der Operator >>> verschiebt die Bits von Ausdruck1 um die in Ausdruck2 angegebene Anzahl von Bits nach rechts. Nullen werden von links ausgefüllt. Von rechts verschobene Ziffern werden verworfen.

Joe
quelle
106

Wenn Sie die beabsichtigte Bedeutung ignorieren, werden Sie höchstwahrscheinlich feststellen, dass sie verwendet wird:


>>> 0 ist insofern einzigartig, als es der einzige Operator ist, der einen Typ in eine positive Ganzzahl konvertiert:

"string"         >>> 0 == 0
(function() { }) >>> 0 == 0
[1, 2, 3]        >>> 0 == 0
Math.PI          >>> 0 == 3

In Ihrem Beispiel ist var len = this.length >>> 0dies eine Möglichkeit, eine Ganzzahllänge zu erhalten, die zum Iterieren verwendet werden kann this, unabhängig vom Typ this.length.


In ähnlicher Weise ~~xkann jede Variable in eine vorzeichenbehaftete Ganzzahl konvertiert werden.

Eric
quelle
Können Sie erklären, wie man mit iteriert >>>?
1
@ K48 Ich glaube nicht, dass er iterieren wollte , ich denke, er wollte sagen, dass dies die Länge zwingt, eine Zahl zu werden. (Ansonsten bin ich ebenso verwirrt.) Aber hier ist eine großartige Antwort, die mehr erklärt: stackoverflow.com/questions/1822350/…
Mike Williamson
8

Dieser Operator ist eine logische Rechtsverschiebung. Hier wird die Zahl um 0 Bits verschoben. Eine mathematische Verschiebung von Nullbits sollte keine Auswirkung haben.

Hier wird es jedoch verwendet, um den Wert in eine vorzeichenlose 32-Bit-Ganzzahl umzuwandeln.

Mark Byers
quelle
3

>>>ist ein bitweiser Operator mit Null-Rechts-Verschiebung .

Ich denke, die einzige Auswirkung >>> 0einer positiven Zahl besteht darin, auf die nächste ganze Zahl abzurunden, genau wie Math.floor(). Ich verstehe nicht, warum dies in Ihrem Beispiel notwendig wäre, da eine .lengthEigenschaft (z. B. von Array) im Allgemeinen bereits eine Ganzzahl ist.

Ich habe auch gesehen, dass die etwas kürzere ~~auf die gleiche Weise verwendet wird : ~~9.5 == 9; // true.

nrabinowitz
quelle
Ich bezweifle, dass es dasselbe ist wie Math.abs()bei negativen Zahlen.
Al Kepp
6
Wenn Sie >>> 0eine negative Zahl verwenden, wird diese in das Kompliment von 2 umgewandelt, und dann wird die richtige Verschiebung vorgenommen. Deshalb -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat
@AlKepp - ja, ich habe den Fehler gesehen und behoben - hätte zuerst getestet werden sollen, aber dies war eindeutig eine Frage zum schnellen Zeichnen :).
Nrabinowitz