2009-09-06 6 views
6

Stavo cercando nel manuale di riferimento di javascript nella pagina indexOf al sito developer.mozilla.org e ho notato alcune cose nel loro codice di implementazione di indexOf, spero che qualcuno possa spiegarmi.Perché utilizzare gli argomenti/*, */around e perché utilizzare >>> quando si estrae la lunghezza di un array?

salvare tutti un giro sul sito di Mozilla, ecco l'intera funzione:

if (!Array.prototype.indexOf) 
{ 
    Array.prototype.indexOf = function(elt /*, from*/) 
    { 
    var len = this.length >>> 0; 

    var from = Number(arguments[1]) || 0; 
    from = (from < 0) 
     ? Math.ceil(from) 
     : Math.floor(from); 
    if (from < 0) 
     from += len; 

    for (; from < len; from++) 
    { 
     if (from in this && 
      this[from] === elt) 
     return from; 
    } 
    return -1; 
    }; 
} 

Quello che non capisco è il /*, from*/ nella dichiarazione di funzione, e lo zero-Fill spostamento a destra >>> nell'estrazione della lunghezza dell'array (var len = this.length >>> 0;).

risposta

10

Il /*, from */ è un parametro commentato. Tuttavia sembra che sia stato lasciato nei commenti per mostrare che questo parametro può facoltativamente essere specificato per la funzione.

var from = Number(arguments[1]) || 0; 

ritengo che arguments[1] sarebbe il valore from se passato in.

L'array argomenti è particolarmente utile con funzioni che possono essere chiamato con un numero variabile di argomenti, oppure con più argomenti di sono stati dichiarati formalmente di accettare. http://www.devguru.com/Technologies/Ecmascript/Quickref/arguments.html

Il >>> è uno spostamento a destra senza segno. Viene utilizzato qui per convertire un numero potenzialmente firmato length in un numero senza segno.

Extract from Professional JavaScript for Web Developers

http://www.c-point.com/javascript_tutorial/jsoprurshift.htm

+0

Grazie, ha senso ora. Non mi rendevo conto che la lunghezza della proprietà poteva essere qualsiasi cosa ma non firmata, javascript mi ​​lascia a volte a zero :) –

3

Il /*, from */ è un parametro opzionale. Avviso var from = Number(arguments[1]) || 0; dopo. Se un secondo parametro è stato passato nella chiamata di funzione, la variabile da verrà impostata su di essa.

Non sicuro del cambio di destra senza segno. Non ha alcun senso per me.

3

Il /*, from*/ nella dichiarazione di funzione è solo un commento dell'autore per dire che esiste un secondo parametro opzionale denominato da. È stato scritto come commento in modo che non faccia parte della firma (Array.prototype.indexOf.length restituisce 1).

E lo spostamento di destra è probabilmente utilizzato per ottenere sempre un valore intero di this.length.

Problemi correlati