JavaScript triple mayor que

88

Vi esta sintaxis en otra publicación de StackOverflow y tenía curiosidad por saber qué hace:

var len = this.length >>> 0;

¿Qué >>>implica?

Jey Balachandran
fuente
1
Ese es un operador de turno correcto, pero ¿por qué cambiaría a la derecha por cero? ¿Es una forma barata de hacerlo parseInt?
Rocket Hazmat
5
>>>siempre establece el bit de signo en cero, incluso si cambia en cero bits.
John Flatness
4
Verifique esta respuesta sobre por qué usan en este caso el >>>operador: stackoverflow.com/questions/3081987/…
Christian C. Salvadó
1
Soporte de ángulo triple JavaScript
wprl
Vi esa sintaxis en developer.mozilla.org/en/docs/Web/JavaScript/Reference/… var length = list.length >>> 0; (mismo caso de uso que el suyo)
Mars Robertson

Respuestas:

49

Es un operador de turno a la derecha sin firmar . Curiosamente, es el único operador bit a bit que no está firmado en JavaScript.

El operador >>> desplaza los bits de expression1 a la derecha el número de bits especificado en expression2. Los ceros se completan desde la izquierda. Los dígitos desplazados hacia la derecha se descartan.

Joe
fuente
107

Haciendo caso omiso de su significado previsto, es muy probable que lo vea utilizado:


>>> 0 es único en el sentido de que es el único operador que convertirá cualquier tipo en un entero positivo:

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

En su ejemplo, var len = this.length >>> 0esta es una forma de obtener una longitud entera para usar para iterar this, sea cual sea el tipo this.length.


Del mismo modo, ~~xse puede utilizar para convertir cualquier variable en un entero con signo.

Eric
fuente
¿Puedes explicar cómo iterar usando >>>?
1
@ K48 No creo que quisiera decir iterar , creo que quiso decir que esto obliga a la longitud a convertirse en un número. (De lo contrario, estoy igualmente confundido). Pero aquí hay una gran respuesta que aclara más: stackoverflow.com/questions/1822350/…
Mike Williamson
8

Ese operador es un desplazamiento lógico a la derecha. Aquí el número se desplaza 0 bits. Un desplazamiento de cero bits matemáticamente no debería tener ningún efecto.

Pero aquí se utiliza para convertir el valor en un entero de 32 bits sin signo.

Mark Byers
fuente
3

>>>es un operador bit a bit, desplazamiento a la derecha de llenado cero .

Creo que el único efecto de >>> 0sobre un número positivo es redondear hacia abajo al entero más cercano, igual que Math.floor(). No veo por qué esto sería necesario en su ejemplo, ya que generalmente una .lengthpropiedad (por ejemplo, de an Array) ya sería un número entero.

También he visto el poco más corto ~~utilizado de la misma manera: ~~9.5 == 9; // true.

nrabinowitz
fuente
Dudo que sea lo mismo que Math.abs()cuando se usa para números negativos.
Al Kepp
6
Si lo hace >>> 0en un número negativo, lo convierte en el complemento de 2, luego hace el cambio correcto. Por eso -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat
@AlKepp - sí, vi el error y lo solucioné - debería haberlo probado primero, pero esta fue claramente una pregunta rápida :).
nrabinowitz