Non si limita a convertire non numeri in numeri, li converte in numeri che possono essere espressi come ints senza segno a 32 bit.
Anche se i numeri di JavaScript sono carri a precisione doppia (*), gli operatori bit per bit ( <<
, >>
, &
, |
e~
) sono definiti in termini di operazioni su interi a 32 bit. Se si esegue un'operazione bit a bit, il numero viene convertito in un int con segno a 32 bit, perdendo tutte le frazioni e i bit di posizione superiore a 32, prima di eseguire il calcolo e quindi riconvertire in Numero.
Quindi fare un'operazione bit a bit senza alcun effetto reale, come uno spostamento a destra di 0 bit >>0
, è un modo rapido per arrotondare un numero e assicurarsi che sia nell'intervallo di 32 bit. Inoltre, l' >>>
operatore triplo , dopo aver eseguito l'operazione senza segno, converte i risultati del suo calcolo in Numero come numero intero senza segno anziché come numero intero con segno che fanno gli altri, quindi può essere utilizzato per convertire i negativi nel complemento a 32 bit-due versione come un grande numero. utilizzando>>>0
assicura di avere un numero intero compreso tra 0 e 0xFFFFFFFF.
In questo caso ciò è utile perché ECMAScript definisce gli indici di array in termini di ints senza segno a 32 bit. Quindi, se stai cercando di implementare array.filter
in un modo che duplica esattamente ciò che dice lo standard ECMAScript Fifth Edition, lanci il numero su int non firmato a 32 bit in questo modo.
(In realtà c'è poco necessità pratica di questo come spero che la gente non stanno andando essere l'impostazione array.length
a 0.5
, -1
, 1e21
o 'LEMONS'
. Ma questo è autori JavaScript di cui stiamo parlando, in modo da non si sa mai ...)
Sommario:
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
(*: beh, sono definiti comportarsi come float. Non mi sorprenderebbe se qualche motore JavaScript usasse effettivamente ints quando poteva, per motivi di prestazioni. Ma sarebbe un dettaglio di implementazione che non potresti prendere vantaggio di.)