Il ne convertit pas seulement les non-nombres en nombres, il les convertit en nombres qui peuvent être exprimés sous forme d'entiers non signés 32 bits.
Bien que les chiffres de JavaScript sont flotteurs double précision (*), les opérateurs binaires ( <<
, >>
, &
, |
et ~
) sont définis en termes d'opérations sur des entiers 32 bits. Faire une opération au niveau du bit convertit le nombre en un entier signé 32 bits, perdant toutes les fractions et les bits de rang supérieur à 32, avant de faire le calcul, puis de revenir en nombre.
Donc, faire une opération au niveau du bit sans effet réel, comme un décalage vers la droite de 0 bits >>0
, est un moyen rapide d'arrondir un nombre et de s'assurer qu'il est dans la plage int 32 bits. De plus, l' >>>
opérateur triple , après avoir effectué son opération non signée, convertit les résultats de son calcul en nombre comme un entier non signé plutôt que l'entier signé que font les autres, de sorte qu'il peut être utilisé pour convertir les négatifs en complément à deux de 32 bits. version comme un grand nombre. L'utilisation >>>0
garantit que vous avez un entier compris entre 0 et 0xFFFFFFFF.
Dans ce cas, cela est utile car ECMAScript définit les index Array en termes d'entiers non signés 32 bits. Donc, si vous essayez d'implémenter array.filter
d'une manière qui duplique exactement ce que dit la norme ECMAScript Fifth Edition, vous convertiriez le nombre en int 32 bits non signé comme ceci.
(En réalité , il y a peu de besoin pratique de ce que nous espérons les gens ne vont pas être mise array.length
à 0.5
, -1
, 1e21
ou 'LEMONS'
. Mais ce sont des auteurs JavaScript dont nous parlons, vous ne savez jamais ...)
Résumé:
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
(*: eh bien, ils sont définis comme se comportant comme des flottants. Cela ne me surprendrait pas si un moteur JavaScript utilisait réellement ints quand il le pouvait, pour des raisons de performances. Mais ce serait un détail d'implémentation que vous n'auriez pas à prendre avantage de.)