JavaScript triplo maior que

89

Eu vi essa sintaxe em outra postagem do StackOverflow e estava curioso para saber o que ela faz:

var len = this.length >>> 0;

O que isso >>>implica?

Jey Balachandran
fonte
1
Esse é um operador de deslocamento certo, mas por que você deslocaria para a direita em zero? É uma forma barata de fazer parseInt?
Rocket Hazmat de
5
>>>sempre define o bit de sinal para zero, mesmo se você mudar para zero bits.
John Flatness,
4
Verifique esta resposta sobre por que eles usam neste caso o >>>operador: stackoverflow.com/questions/3081987/…
Christian C. Salvadó
1
Suporte angular triplo JavaScript
wprl
Eu vi essa sintaxe em developer.mozilla.org/en/docs/Web/JavaScript/Reference/… var length = list.length >>> 0; (mesmo caso de uso que o seu)
Mars Robertson

Respostas:

49

Esse é um operador de mudança à direita sem sinal . Curiosamente, é o único operador bit a bit que é unsigned em JavaScript.

O operador >>> desloca os bits da expressão1 exatamente pelo número de bits especificado na expressão2. Zeros são preenchidos da esquerda. Os dígitos deslocados para a direita são descartados.

Joe
fonte
107

Ignorando seu significado pretendido, é mais provável que você o veja usado:


>>> 0 é único por ser o único operador que converterá qualquer tipo em um número inteiro positivo:

"string"         >>> 0 == 0
(function() { }) >>> 0 == 0
[1, 2, 3]        >>> 0 == 0
Math.PI          >>> 0 == 3

Em seu exemplo, var len = this.length >>> 0esta é uma maneira de obter um comprimento inteiro para usar para iterar this, seja qual for o tipo this.length.


Da mesma forma, ~~xpode ser usado para converter qualquer variável em um inteiro com sinal.

Eric
fonte
você pode explicar como iterar usando >>>?
1
@ K48 Não acho que ele quis dizer iterar , acho que ele quis dizer que o comprimento das forças se torna um número. (Caso contrário, estou igualmente confuso.) Mas aqui está uma ótima resposta que elucida mais: stackoverflow.com/questions/1822350/…
Mike Williamson
9

Esse operador é um deslocamento lógico para a direita. Aqui, o número é deslocado 0 bits. Um deslocamento de zero bits matemeticamente não deve ter efeito.

Mas aqui ele é usado para converter o valor em um inteiro de 32 bits sem sinal.

Mark Byers
fonte
3

>>>é um operador bit a bit, deslocamento para a direita com preenchimento zero .

Acho que o único efeito de >>> 0em um número positivo é arredondar para baixo para o inteiro mais próximo, o mesmo que Math.floor(). Não vejo por que isso seria necessário em seu exemplo, já que geralmente uma .lengthpropriedade (por exemplo, de an Array) já seria um número inteiro.

Eu também vi o ligeiramente mais curto ~~usado da mesma forma: ~~9.5 == 9; // true.

Nrabinowitz
fonte
Duvido que seja o mesmo Math.abs()quando usado para números negativos.
Al Kepp de
6
Se você fizer >>> 0em um número negativo, ele o converterá no elogio de 2 e, em seguida, fará o deslocamento certo. Portanto -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat
@AlKepp - sim, eu vi o erro e o consertei - deveria ter testado primeiro, mas esta foi claramente uma questão de desenho rápido :).
nrabinowitz,