No solo convierte números que no son números en números, sino que los convierte en números que se pueden expresar como entradas de 32 bits sin signo.
Aunque los números de JavaScript son flotantes de doble precisión (*), los operadores de bits ( <<
, >>
, &
, |
y~
) se definen en términos de operaciones de enteros de 32 bits. Hacer una operación a nivel de bit convierte el número a un int con signo de 32 bits, perdiendo cualquier fracción y bits de lugar superior a 32, antes de hacer el cálculo y luego volver a convertirlo en Número.
Entonces, hacer una operación bit a bit sin efecto real, como un desplazamiento hacia la derecha de 0 bits >>0
, es una forma rápida de redondear un número y asegurarse de que esté en el rango int de 32 bits. Además, el >>>
operador triple , después de realizar su operación sin signo, convierte los resultados de su cálculo en Número como un entero sin signo en lugar del entero con signo que hacen los demás, por lo que puede usarse para convertir negativos al complemento de dos bits de 32 bits versión como un gran número. Utilizando>>>0
garantiza que tenga un número entero entre 0 y 0xFFFFFFFF.
En este caso, esto es útil porque ECMAScript define los índices de matriz en términos de entradas de 32 bits sin signo. Entonces, si está tratando de implementar array.filter
de una manera que duplica exactamente lo que dice el estándar ECMAScript Fifth Edition, debería enviar el número a int de 32 bits sin signo de esta manera.
(En realidad hay poca necesidad práctica de esto como es de esperar la gente no va a ser la creación array.length
de 0.5
, -1
, 1e21
o 'LEMONS'
. Pero esto es autores de JavaScript que estamos hablando, así que nunca se sabe ...)
Resumen:
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
(*: bueno, se definen como comportarse como flotadores. No me sorprendería si algún motor de JavaScript realmente usara ints cuando pudiera, por razones de rendimiento. Pero eso sería un detalle de implementación que no podría tomar. Ventaja de.)