Nicht-Zahlen werden nicht nur in Zahlen konvertiert, sondern auch in Zahlen, die als vorzeichenlose 32-Bit-Ints ausgedrückt werden können.
Obwohl JavaScript die Zahlen mit doppelter Genauigkeit Schwimmer (*) sind die Bit - Operatoren ( <<
, >>
, &
, |
und ~
) auf 32-Bit - Integer in Bezug auf die Operationen definiert. Durch eine bitweise Operation wird die Zahl in ein 32-Bit-Int mit Vorzeichen konvertiert, wobei Brüche und höherwertige Bits als 32 verloren gehen, bevor die Berechnung durchgeführt und dann wieder in Zahl konvertiert wird.
Eine bitweise Operation ohne tatsächlichen Effekt, wie eine Verschiebung von 0 Bits nach rechts >>0
, ist also eine schnelle Möglichkeit, eine Zahl zu runden und sicherzustellen, dass sie im 32-Bit-Int-Bereich liegt. Darüber hinaus >>>
konvertiert der Dreifachoperator nach seiner vorzeichenlosen Operation die Ergebnisse seiner Berechnung als vorzeichenlose Ganzzahl in die vorzeichenbehaftete Ganzzahl und nicht in die vorzeichenbehaftete Ganzzahl, sodass die Negative in das 32-Bit-Zwei-Komplement konvertiert werden können Version als große Zahl. Durch >>>0
die Verwendung wird sichergestellt, dass Sie eine Ganzzahl zwischen 0 und 0xFFFFFFFF haben.
In diesem Fall ist dies nützlich, da ECMAScript Array-Indizes in Form von 32-Bit-Ints ohne Vorzeichen definiert. Wenn Sie also versuchen, array.filter
auf eine Weise zu implementieren , die genau das dupliziert, was der ECMAScript Fifth Edition-Standard sagt, würden Sie die Zahl wie folgt in 32-Bit-Int ohne Vorzeichen umwandeln.
(In Wirklichkeit gibt es wenig praktische Notwendigkeit dafür , wie hoffentlich die Menschen gehen nicht einstellen werden , array.length
um 0.5
, -1
, 1e21
oder 'LEMONS'
. Aber das ist JavaScript Autoren wir reden, so dass Sie nie wissen ...)
Zusammenfassung:
1>>>0 === 1
-1>>>0 === 0xFFFFFFFF -1>>0 === -1
1.7>>>0 === 1
0x100000002>>>0 === 2
1e21>>>0 === 0xDEA00000 1e21>>0 === -0x21600000
Infinity>>>0 === 0
NaN>>>0 === 0
null>>>0 === 0
'1'>>>0 === 1
'x'>>>0 === 0
Object>>>0 === 0
(*: Nun, sie verhalten sich wie Floats. Es würde mich nicht wundern, wenn eine JavaScript-Engine aus Leistungsgründen tatsächlich Ints verwenden würde, wenn dies möglich wäre. Aber das wäre ein Implementierungsdetail, das Sie nicht benötigen würden Vorteil von.)