2010-11-02 17 views
15

Powiel możliwe:
What good does zero-fill bit-shifting by 0 do? (a >>> 0)Co robi x >>> 0?

Próbowałem pewne funkcjonalne koncepcje programowania w projekcie kopalni i czytałem o Array.prototype.map, co jest nowego w ES5 i wygląda to:

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

Co Zastanawiam się, dlaczego to robi t.length >>> 0. Ponieważ nic nie robi. x >>> 0 //-> x! (tak długo, jak x jest liczbą, oczywiście)

Pamiętaj też, że nie wiem, jak działają operatory bitowe.

+0

i wiele innych http://stackoverflow.com/questions/1822350/ http://stackoverflow.com/questions/1474815/ http://stackoverflow.com/questions/1385491/ http: // stackoverflow.com/questions/3348438/ Są one łatwe do znalezienia tylko wtedy, gdy można znaleźć pierwszą> _>. – kennytm

+1

@KennyTM ~ Dobre duplikaty, jeśli wiesz, jakie są nazwy rzeczy ...;) – jcolebrand

Odpowiedz

21

x >>> 0 wykonuje logiczne (niepodpisane) przesunięcie w prawo o 0 bitów, co jest równoważne z operacją "no-op". Jednak przed przesunięciem w prawo musi przekonwertować wartość x na niepodpisaną 32-bitową liczbę całkowitą. Dlatego ogólny efekt x >>> 0 jest konwertowany x na 32-bitową liczbę całkowitą bez znaku.

To zapewnia, że ​​len jest liczbą nieujemną.

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

Czy możesz wyjaśnić, dlaczego coś.length byłoby mniej niż 0? – Patriks

+0

@Pratik I dlaczego miałoby to być "prawdziwe"? Prawdopodobnie nie ma w tym prawdziwego powodu. Ale gdyby do tego doszło (przez przypadek np..), Złamałoby to '.map'. Przykładowy kod: 'Array.prototype.map.call ({length: -2}, f)' – m93a