quanto non solo converte non Numeri di numero, li converte in numeri che possono essere espressi come 32 bit unsigned int.
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. Effettuando un'operazione bit per bit, il numero viene convertito in un int con segno a 32 bit, perdendo frazioni e bit di posizione superiore a 32, prima di eseguire il calcolo e quindi di tornare a Numero.
Così facendo un'operazione bit a bit senza alcun effetto reale, come uno spostamento verso 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 un numero intero senza segno anziché il numero intero con segno che gli altri fanno, quindi può essere utilizzato per convertire i negativi in 32-bit-two's- complemento versione come un numero grande. L'utilizzo di >>>0
assicura che tu abbia un numero intero compreso tra 0 e 0xFFFFFFFF.
In questo caso questo è utile perché ECMAScript definisce gli indici di array in termini di valori di input a 32 bit senza segno. Quindi, se si sta tentando di implementare array.filter
in un modo che duplichi esattamente quello che dice lo standard ECMAScript Fifth Edition, si invierà il numero a un int non firmato a 32 bit come questo.
(In realtà c'è poco necessità pratica di questo come spero che la gente non stanno andando essere l'impostazione array.length
-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 come comportarsi come carri non mi sorprenderebbe se qualche motore JavaScript effettivamente utilizzato int quando potrebbe, per motivi di prestazioni.. Ma quello sarebbe un dettaglio di implementazione y ou non arriva a prendere un vantaggio di.)
@CMS Vero, questo codice/domanda proviene da quelli; tuttavia, la risposta qui è più specifica e preziosa di quelle precedenti. –
Oppure si tratta di un bug o di Mozilla che stanno assumendo questo.lunghezza potrebbe essere -1. >>> è un operatore di shift senza segno quindi var len sarà sempre 0 o maggiore. – user347594
-1 >>> 0 === 4294967295 – jimr