No sólo convertir a los no Números de Número, que los convierte en los números que se pueden expresar como enteros de 32 bits sin signo.
Aunque los números de JavaScript son flotantes de doble precisión (*), los operadores de bits (<<
, >>
, &
, |
y ~
) están definidos en términos de operaciones de enteros de 32 bits. Al hacer una operación en modo bit, el número se convierte en una int de 32 bits, perdiendo cualquier fracción y un lugar más alto que 32, antes de hacer el cálculo y luego volver a convertirlo en Number.
Por lo tanto, hacer una operación en modo bit sin efecto real, como un desplazamiento hacia la derecha de 0 bits >>0
, es una manera rápida de redondear un número y asegurar que esté dentro del rango de 32 bits. Además, la triple >>>
operador, después de hacer su operación sin firmar, convierte los resultados de su cálculo de número como un entero sin signo en lugar del entero con signo de los demás, por lo que puede ser usado para convertir los negativos a la de 32 bits two's- versión del complemento como un número grande. Usar >>>0
asegura que tienes un número entero entre 0 y 0xFFFFFFFF.
En este caso, esto es útil porque ECMAScript define índices de matriz en términos de enteros sin signo de 32 bits. Por lo tanto, si intenta implementar array.filter
de forma que duplique exactamente lo que dice el estándar ECMAScript Fifth Edition, debería convertir el número a int sin firmar de 32 bits 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
a 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, son definidos como comportarse como flotadores no me sorprendería si algún motor de JavaScript enteros utiliza realmente cuando se podía, por razones de rendimiento.. Pero eso sería un detalle de implementación y ou no llegaría a tomar ventaja de.)
@CMS Cierto, este código/pregunta proviene de aquellos; sin embargo, la respuesta aquí es más específica y valiosa que las anteriores. –
O es un error o los chicos de Mozilla están asumiendo esto. La duración podría ser -1. >>> es un operador de desplazamiento sin signo, por lo que siempre será 0 o mayor. – user347594
-1 >>> 0 === 4294967295 – jimr