2010-11-02 11 views
15

Mögliche Duplizieren:
What good does zero-fill bit-shifting by 0 do? (a >>> 0)Was macht x >>> 0?

Ich habe in einem Projekt von mir einige funktionale Programmierung Konzepte auszuprobieren und ich las über Array.prototype.map, die in ES5 ist neu und sieht aus wie dies:

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

Was ich frage mich, ist, warum es t.length >>> 0 tun. Weil es nichts zu tun scheint. x >>> 0 //-> x! (solange x eine Zahl ist, natürlich)

Beachten Sie auch, dass ich nicht weiß, wie bitweise Operatoren arbeiten.

+0

und viele andere http://stackoverflow.com/questions/1822350/ http://stackoverflow.com/questions/1474815/ http://stackoverflow.com/questions/1385491/ http: // stackoverflow.com/questions/3348438/ Diese sind nur dann einfach zu finden, wenn der erste gefunden wurde> _>. – kennytm

+1

@KennyTM ~ Gute Duplikate, wenn Sie wissen, was die Namen der Dinge sind ...;) – jcolebrand

Antwort

21

x >>> 0 führt eine logische (vorzeichenlose) Rechtsverschiebung von 0 Bits durch, was einem No-Op entspricht. Vor der rechten Verschiebung muss es jedoch die x in eine vorzeichenlose 32-Bit-Ganzzahl konvertieren. Daher ist der Gesamteffekt von x >>> 0 konvertieren x in eine 32-Bit-Ganzzahl ohne Vorzeichen.

Dies stellt len ist eine nichtnegative Zahl.

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

Können Sie bitte erklären, warum etwas.Länge wäre weniger als 0? – Patriks

+0

@Pratik Und warum wäre es "wahr"? Es gibt wahrscheinlich keinen wirklichen Grund dafür. Wenn es (zufällig) passiert wäre, würde es die '.map' zerstören. Beispielcode: 'Array.prototype.map.call ({length: -2}, f)' – m93a