2010-11-02 25 views
15

Possible en double:
What good does zero-fill bit-shifting by 0 do? (a >>> 0)Que fait x >>> 0?

J'ai essayé quelques concepts de programmation fonctionnelle dans un projet de mine et je lisais à propos Array.prototype.map, ce qui est nouveau dans ES5 et ressemble ceci:

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; 
}; 

ce que je me demande pourquoi il est fait t.length >>> 0. Parce que ça ne semble rien faire. x >>> 0 //-> x! (tant que x est un nombre, évidemment)

Notez également que je ne sais pas comment les opérateurs bit-bit fonctionnent.

+0

et beaucoup d'autres http://stackoverflow.com/questions/1822350/ http://stackoverflow.com/questions/1474815/ http://stackoverflow.com/questions/1385491/ http: // stackoverflow.com/questions/3348438/ Ceux-ci sont faciles à trouver seulement quand le premier peut être trouvé> _>. – kennytm

+1

@KennyTM ~ Bonnes duplications si vous savez quels sont les noms des choses ...;) – jcolebrand

Répondre

21

x >>> 0 effectue un décalage vers la droite logique (non signé) de 0 bits, ce qui équivaut à un non-op. Toutefois, avant le décalage de droite, il doit convertir le x en un entier non signé de 32 bits. Par conséquent, l'effet global de x >>> 0 est de convertir x en un entier non signé de 32 bits.

Ceci garantit que len est un nombre non négatif.

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

Pouvez-vous expliquer pourquoi quelque chose.length serait inférieur à 0? – Patriks

+0

@Pratik Et pourquoi serait-ce «vrai»? Il n'y a probablement aucune raison réelle pour cela. Mais si c'est arrivé (par accident, par exemple.), Cela casserait le '.map'. Exemple de code: 'Array.prototype.map.call ({length: -2}, f)' – m93a