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?


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.


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.


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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.