Nie tylko konwertuje nie-liczby na liczbę, ale konwertuje je na liczby, które można wyrazić jako 32-bitowe liczby całkowite bez znaku.
Chociaż obsługa JavaScript Liczby są pływaki podwójnej precyzji (*), operatory bitowe ( <<
, >>
, &
, |
i ~
) są zdefiniowane w kategoriach operacji na 32-bitowych liczb całkowitych. Wykonanie operacji bitowej konwertuje liczbę na 32-bitową liczbę int ze znakiem, tracąc ułamki i bity znajdujące się wyżej niż 32, przed wykonaniem obliczeń, a następnie konwersją z powrotem na Number.
Zatem wykonanie operacji bitowej bez faktycznego efektu, jak przesunięcie w prawo o 0 bitów >>0
, jest szybkim sposobem na zaokrąglenie liczby i upewnienie się, że mieści się ona w 32-bitowym zakresie int. Dodatkowo >>>
operator potrójny , po wykonaniu operacji bez znaku, konwertuje wyniki swoich obliczeń na liczbę całkowitą bez znaku, a nie na liczbę całkowitą ze znakiem, którą robią inne, więc może być używany do konwersji liczb ujemnych na uzupełnienie do dwóch 32-bitowych wersja jako duża liczba. Użycie >>>0
zapewnia, że masz liczbę całkowitą od 0 do 0xFFFFFFFF.
W tym przypadku jest to przydatne, ponieważ ECMAScript definiuje indeksy tablicy w postaci 32-bitowych liczb całkowitych bez znaku. Więc jeśli próbujesz zaimplementować array.filter
w sposób, który dokładnie powiela to, co mówi standard ECMAScript Fifth Edition, możesz rzutować liczbę na 32-bitowy int bez znaku w ten sposób.
(W rzeczywistości niewiele jest praktyczna potrzeba to mam nadzieję, że jak ludzie nie będą ustalone array.length
na 0.5
, -1
, 1e21
lub 'LEMONS'
. Ale to autorzy JavaScript mówimy, więc nigdy nie wiadomo ...)
Podsumowanie:
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
(*: cóż, są zdefiniowane jako zachowujące się jak zmiennoprzecinkowe. Nie zdziwiłbym się, gdyby jakiś silnik JavaScript faktycznie używał intów, kiedy to możliwe, ze względu na wydajność. Ale to byłby szczegół implementacji, którego nie można by wziąć zaleta.)