2015-07-10 21 views
5

Stavo solo esaminando la documentazione di Mozilla per gli sviluppatori e ho trovato la notazione che non so a cosa serve e inoltre non riesco a trovare alcuna informazione tramite internet.Operatore ">>>" - a cosa serve?

Array filter polyfill - line 10

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

Eventuali suggerimenti che cosa questo operatore è per?

+0

È un [operatore bit a bit] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators). – Danny

risposta

4

TL; DR

t.length >>> 0; 

in realtà cerca di ottenere un 32 bit numero intero senza segno valida dal t.length. Per quello che sappiamo, t.length potrebbe essere di qualsiasi tipo (un oggetto, un array, una stringa, ecc.). >>> 0 restituisce il valore inalterato se è già un numero senza segno valido a 32 bit. Ad esempio,

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

Normalmente, questo bit trucco è utilizzato per evitare un controllo dei tipi if blocco, come questo

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

Potremmo ancora per convertire len in un numero intero, se si tratta di un galleggiante valore in punti.

Spiegazione

>>> si chiama Zero-fill operatore di spostamento a destra. Oltre ad essere utilizzato come operatore bit a bit, viene utilizzato per ottenere un valore numerico a 32 bit da un oggetto. Il ECMA Script 5.1 Specification for >>> dice che

  1. Let Lref essere il risultato della valutazione ShiftExpression.
  2. Lasciate lval essere GetValue (lref).
  3. Lasciate rref essere il risultato della valutazione AdditiveExpression.
  4. Lasciate rval be GetValue (rref).
  5. Let lnum be ToUint32 (lval).
  6. Lasciate rnum be ToUint32 (rval).
  7. Let shiftCount essere il risultato di mascherare tutte ma meno significativi 5 bit di rnum, cioè calcolare rnum & 0x1F.
  8. Restituisce il risultato dell'esecuzione di uno spostamento a destra con riempimento pari a zero di lnum per shiftCount bit. I bit vuoti vengono riempiti con zero. Il risultato è un numero intero a 32 bit senza segno.

Converte fondamentalmente entrambi gli operandi a 32 bit unsigned integer (Fase 5 e 6) e sposta l'espressione sinistra, mano destra volte espressione lato.

Se guardiamo il definition of ToInt32,

  1. Let numero essere il risultato della chiamata ToNumber sull'argomento ingresso.
  2. Se numero è NaN, +0, -0, + ∞ o -∞, ritorno +0.
  3. Let posInt essere segno (numero) * piano (abs (numero)).
  4. Let int32bit essere posInt modulo 2 ; ovvero un valore intero finita k di tipo numero con segno positivo e meno di 2 in grandezza tale che la differenza di matematica posInt e k è matematicamente un multiplo intero di 2 .
  5. Ritorno int32bit.

Prima l'argomento viene convertito in un numero (se è un non un numero valido poi NaN sarà restituita da ToNumber). E il passaggio 4 si assicura di restituire un numero valido nell'intervallo da 0 a 2 .

+2

_ * si inchina alla risposta superiore * _ +1 (Sembra che i cani regnino sovrani su questa domanda ;-)) – Cerbrus

+0

Ora è perfettamente chiaro! Grazie! A proposito, questa sembra essere un'ottima domanda per il colloquio di lavoro con il ninja JS :) – kuba

+1

@ kuba: Non penso che qualcuno possa aspettarsi che uno sviluppatore lo sappia. Tuttavia, con la documentazione accessibile ... – Cerbrus

4

È un operatore "Zero-fill right shift" (bit a bit).

Questo operatore sposta il primo operando del numero di bit specificato a destra. I bit in eccesso spostati a destra vengono scartati. I bit zero vengono spostati da sinistra. Il bit di segno diventa 0, quindi il risultato è sempre non negativo.

Per i numeri non negativi, lo spostamento a destra con riempimento a zero e lo spostamento a destra di propagazione del segno producono lo stesso risultato. Ad esempio, 9 >>> 2 produce 2, lo stesso di 9 >> 2:

Tuttavia, questo non è il caso per i numeri negativi. Ad esempio, -9 >>> 2 cede 1073741821, che è diverso -9 >> 2 (che produce -3):

@thefourtheyeanswered with a good explanation sull'uso di questo operatore.