2012-02-20 16 views
5

Para qué es esto:¿Qué está haciendo esta línea? arr.Length >>> 0

arr.length >>> 0 

Y por qué debería querer usarlo?

+0

también necesito ayuda en las etiquetas para agregar el nombre de ese operador, ya que no sé su nombre – mithril333221

+0

El contexto es el rey ... danos un poco. – jondavidjohn

+3

Normalmente no me gusta editar el código en las preguntas, pero estoy * bastante * seguro de que quería decir 'longitud', no' longitud'. –

Respuesta

8

Es el operador de desplazamiento a la derecha sin signo. En este caso (cuando se usa con 0) garantiza que arr.length es un número entero, o más bien, se evalúa como arr.length como valor entero estricto sin signo de 32 bits. (Esto significa que nunca es NaN, no negativo, y nunca tiene una parte decimal.)

Ejemplos:

'1'  >>> 0: 1 
1   >>> 0: 1 
''  >>> 0: 0 
undefined >>> 0: 0 
null  >>> 0: 0 
1.0∙∙∙01 >>> 0: 1 

Comparar con:

Number('1')  : 1 
Number(1)  : 1 
Number('')  : 0 
Number(undefined): NaN 
Number(null)  : 0 
Number(1.0∙∙∙01) : 1.0∙∙∙01 

Es sólo existe para asegurar que la longitud correcta esta siendo usado.

5

Asegura que .length es un entero de 32 bits.

En la mayoría de las implementaciones, los índices de matriz está limitado a un rango de 32 bits (al menos cuando se trabaja con Array.prototype métodos, y los comportamientos mágicos de .length).

+2

Te perdiste '... ¿por qué debería querer usarlo?'. El único caso en el que podría considerarse es si * length * podría establecerse en un valor no entero. Pero eso [no puede ocurrir] (http://es5.github.com/#x15.4.5.1) en una implementación conforme a ECMA-262. La longitud es ** siempre ** un entero no negativo. Entonces la respuesta es: ** nunca **. – RobG

+0

No diría "nunca". Se usa si está escribiendo un shim para un método estándar 'Array.prototype' que intenta ser compatible con ECMA-262 (o lo más cerca posible), ya que los métodos estándar hacen una conversión' 'ToUint32 (lenVal)' *. Además, la especificación permite que los métodos 'Array.prototype' se apliquen a los objetos de tipo" tipo array ". Esto proporcionaría la motivación para un shim para imponer el valor apropiado de '.length'. –

+0

Si ese fuera el caso, entonces los valores -ve deben tratarse primero ya que '>>>' tiene algunos efectos drásticos sobre ellos. Y limita el tamaño de la longitud a un poco menos que el disponible para * array.length * incorporado, por lo que es un método deficiente para garantizar o convertir el valor en un entero no negativo. – RobG