2015-07-10 19 views
5

Właśnie przeglądałem dokumentację dla programistów Mozilli i stwierdziłem, że nie wiem, do czego służy i nie mogę znaleźć żadnych informacji przez Internet.Operator ">>>" - do czego służy?

Array filter polyfill - line 10

var t = Object(this); 
var len = t.length >>> 0; 

Wszelkie sugestie co do tego operatora?

+0

To jest [operator bitowy] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators). – Danny

Odpowiedz

4

TL; DR

t.length >>> 0; 

rzeczywiście próbuje uzyskać poprawną 32 bitową liczbę całkowitą bez znaku od t.length. Co wiemy, może być dowolny typ (obiekt, tablica, łańcuch itp.). >>> 0 zwraca niezmienioną wartość, jeśli jest już prawidłowym 32-bitowym numerem bez znaku. Na przykład,

console.log({} >>> 0); 
// 0 
console.log([] >>> 0); 
// 0 
console.log("Google" >>> 0); 
// 0 

Normalnie, to bitowe trik stosowany jest w celu uniknięcia typu sprawdzanie if bloku, jak to

var len = 0; 
if (typeof data === 'number') { 
    len = data; 
} 

Możemy nadal trzeba konwertować len do liczby całkowitej, jeżeli jest to pływający Wartość punktu.

Wyjaśnienie

>>> nazywa Zero wypełnić właściwą operatorem przesunięcia. Oprócz tego, że jest używany jako operator bitowy, służy do uzyskania 32-bitowej wartości liczbowej z obiektu. ECMA Script 5.1 Specification for >>> mówi, że

  1. Niech lref być wynikiem oceny ShiftExpression.
  2. Niech lval be GetValue (lref).
  3. Niech rref będzie wynikiem oceny AdditiveExpression.
  4. Niech rval be GetValue (rref).
  5. Niech lnum będzie ToUint32 (lval).
  6. Niech rnum będzie ToUint32 (rval).
  7. Niech shiftCount być wynikiem maskowania wszystkich, ale najmniej znaczących 5 bitów rnum, czyli obliczyć rnum & 0x1F.
  8. Powoduje zwrócenie wyniku przeprowadzania zerowego napełniania prawej zmiany lnum przez shiftCount bitów. Wolne bity są wypełniane zerami. Wynikiem jest 32-bitowa liczba całkowita bez znaku.

Zasadniczo przetwarza oba argumenty do 32 bitów liczba całkowita bez znaku (krok 5 i 6), przesuwa ekspresji lewa, prawa ręka razy ekspresji bocznych.

Jeśli spojrzymy na definition of ToInt32,

  1. Niech liczba być wynikiem nazywając ToNumber na argumencie wejściowym.
  2. Jeśli numer to NaN, +0, -0, + ∞ lub -∞, return +0.
  3. Niech posInt być znak (liczba) * podłoga (abs (liczba)).
  4. Niech int32bit być posInt modulo 2 ; to jest wartość całkowita skończony k typu Number ze znakiem dodatnim, a mniej niż 2 wielkości w taki sposób, że matematyczny różnica posInt i k jest matematycznie całkowitą wielokrotnością 2 .
  5. Powrót int32bit.

Pierwszy argument zostaje przekształcony do szeregu (jeśli to nie jest prawidłowy numer następnie NaN zostanie zwrócona ToNumber). Krok 4 zapewnia, że ​​zwrócisz poprawną liczbę z zakresu od 0 do 2 .

+2

_ * łuki do najwyższej odpowiedzi * _ +1 (Wygląda na to, że w tym pytaniu królują psy ;-)) – Cerbrus

+0

Teraz jest zupełnie jasne! Dzięki! BTW, wydaje się to bardzo dobre pytanie do rozmowy kwalifikacyjnej JS ninja :) – kuba

+1

@kuba: Nie sądzę, że ktoś może się spodziewać, że deweloper to wie. Jednak dzięki dostępnej dokumentacji ... – Cerbrus

4

To jest operator "Zero-fill right shift" (bitowy).

Ten operator przesuwa pierwszy operand o określoną liczbę bitów w prawo. Nadmiar bitów przesunięty w prawo jest odrzucany. Zero bitów jest przesunięte z lewej strony. Bit znaku staje się 0, więc wynik jest zawsze nieujemny.

Dla liczb nieujemnych, przesunięcie w prawo w prawo i przesunięcie w prawo i przesunięcie w prawo dają taki sam wynik. Na przykład 9 >>> 2 daje 2, taki sam jak 9 >> 2:

Jednak nie dotyczy to liczb ujemnych. Na przykład, -9 >>> 2 daje 1073741821, który jest inny niż -9 >> 2 (co daje -3)

@thefourtheyeanswered with a good explanation o wykorzystaniu tego operatora.