2010-11-02 23 views
15

Eventuali duplicati:
What good does zero-fill bit-shifting by 0 do? (a >>> 0)Cosa fa x >>> 0?

Ho provato alcuni concetti di programmazione funzionali in un mio progetto e stavo leggendo Array.prototype.map, che è nuovo in ES5 e si presenta come questo:

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

Quello che mi chiedo è per questo che sta facendo t.length >>> 0. Perché non sembra fare nulla. x >>> 0 //-> x! (purché x sia un numero, ovviamente)

Inoltre, si noti che non so come funzionano gli operatori bit a bit.

+0

e un sacco di altri http://stackoverflow.com/questions/1822350/ http://stackoverflow.com/questions/1474815/ http://stackoverflow.com/questions/1385491/ http: // stackoverflow.com/questions/3348438/ Questi sono facili da trovare solo quando si trova il primo> _>. – kennytm

+1

@KennyTM ~ Buoni duplicati se sai quali sono i nomi delle cose ...;) – jcolebrand

risposta

21

x >>> 0 esegue un right-shift logico (senza segno) di 0 bit, che equivale a un no-op. Tuttavia, prima del passaggio a destra, è necessario convertire x in un numero intero a 32 bit senza segno. Pertanto, l'effetto complessivo di x >>> 0 viene convertito in x in un numero intero senza segno a 32 bit.

Ciò garantisce che len è un numero non 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

Puoi spiegare perché qualcosa.lunghezza sarebbe inferiore a 0? – Patriks

+0

@Pratik E perché sarebbe "vero"? Probabilmente non esiste una ragione reale per questo. Ma se succedesse (per esempio per errore), avrebbe rotto il '.map'. Codice di esempio: 'Array.prototype.map.call ({length: -2}, f)' – m93a