2010-11-02 25 views
15

Duplicar posible:
What good does zero-fill bit-shifting by 0 do? (a >>> 0)¿Qué hace x >>> 0?

He estado probando algunos conceptos de programación funcionales en un proyecto mío y yo estaba leyendo sobre Array.prototype.map, que es nuevo en la ES5 y parece esto:

Array.prototype.map = function(fun) { 
    "use strict"; 
    if (this === void 0 || this === null) { 
     throw new TypeError(); 
    } 
    var t = Object(this); 
    var len = t.length >>> 0; 
    if (typeof fun !== "function") { 
     throw new TypeError(); 
    } 
    var res = new Array(len); 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) { 
     if (i in t) { 
      res[i] = fun.call(thisp, t[i], i, t); 
     } 
    } 
    return res; 
}; 

lo que me pregunto es por qué se está haciendo t.length >>> 0. Porque no parece hacer nada. x >>> 0 //-> x! (siempre que x sea un número, obviamente)

Además, tenga en cuenta que no sé cómo funcionan los operadores bit a bit.

+0

y muchos otros http://stackoverflow.com/questions/1822350/ http://stackoverflow.com/questions/1474815/ http://stackoverflow.com/questions/1385491/ http: // stackoverflow.com/questions/3348438/ Estos son fáciles de encontrar solo cuando se puede encontrar el primero> _>. – kennytm

+1

@KennyTM ~ Bien duplicados si sabes cuáles son los nombres de las cosas ...;) – jcolebrand

Respuesta

21

x >>> 0 realiza un cambio de sentido lógico (sin signo) de 0 bits, que es equivalente a un no-op. Sin embargo, antes del cambio a la derecha, debe convertir el x en un entero de 32 bits sin signo. Por lo tanto, el efecto general de x >>> 0 es convertir x en un entero sin signo de 32 bits.

Esto asegura len es un número no negativo.

js> 9 >>> 0 
9 
js> "9" >>> 0 
9 
js> "95hi" >>> 0 
0 
js> 3.6 >>> 0 
3 
js> true >>> 0 
1 
js> (-4) >>> 0 
4294967292 
+0

¿Puedes explicar por qué algo.tiempo sería menor que 0? – Patriks

+0

@Pratik ¿Y por qué sería 'verdad'? Probablemente no haya una razón real para eso. Pero si sucediera (por accidente, por ejemplo), rompería el '.map'. Código de ejemplo: 'Array.prototype.map.call ({length: -2}, f)' – m93a