Ele não converte apenas não-números em número, mas também em números que podem ser expressos como ints não assinados de 32 bits.
Embora os números de JavaScript são bóias de precisão dupla (*), os operadores bit a bit ( <<
, >>
, &
, |
e ~
) são definidos em termos de operações sobre inteiros de 32 bits. Fazer uma operação bit a bit converte o número em um int assinado de 32 bits, perdendo frações e bits de posição superior a 32, antes de fazer o cálculo e depois converter novamente em Number.
Portanto, fazer uma operação bit a bit sem efeito real, como um deslocamento para a direita de 0 bits >>0
, é uma maneira rápida de arredondar um número e garantir que ele esteja no intervalo int de 32 bits. Além disso, o >>>
operador triplo , depois de fazer sua operação não assinada, converte os resultados de seu cálculo em Number como um número inteiro não assinado, em vez do número inteiro assinado que os outros, para que possa ser usado para converter negativos no complemento de 32 bits e dois versão como um número grande. Usar >>>0
garante que você tenha um número inteiro entre 0 e 0xFFFFFFFF.
Nesse caso, isso é útil porque o ECMAScript define índices de matriz em termos de entradas não assinadas de 32 bits. Portanto, se você estiver tentando implementar array.filter
de uma maneira que duplique exatamente o que o padrão ECMAScript Fifth Edition diz, você converterá o número em int não assinado de 32 bits dessa maneira.
(Na realidade, há pouca necessidade prática para isso, espero que as pessoas não vão estar definindo array.length
a 0.5
, -1
, 1e21
ou 'LEMONS'
. Mas isso é JavaScript autores que estamos falando, então nunca se sabe ...)
Resumo:
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
(*: bem, eles são definidos como se comportando como carros alegóricos. Não me surpreenderia se algum mecanismo JavaScript realmente usasse ints quando pudesse, por razões de desempenho. Mas isso seria um detalhe de implementação que você não faria nada vantagem de.)