2009-09-06 9 views
6

Estaba buscando en el manual de referencia de javascript en la página indexOf en el sitio developer.mozilla.org, y noté algunas cosas en su código de implementación de indexOf, espero que alguien pueda explicarme.¿Por qué usar los argumentos/*, */around y por qué usar >>> al extraer la longitud de una matriz?

Para guardar todos un ida y vuelta al sitio de Mozilla, aquí está toda la función:

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

Lo que no entiendo es el /*, from*/ en la declaración de la función, y el relleno de cero desplazamiento a la derecha >>> en la extracción de la longitud de la matriz (var len = this.length >>> 0;).

Respuesta

10

El /*, from */ es un parámetro comentado. Sin embargo, parece que se ha dejado en los comentarios para mostrar que este parámetro puede opcionalmente ser especificado para la función.

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

creo que arguments[1] sería el valor from si se ha pasado.

La matriz de argumentos es especialmente útil con funciones que se pueden llamada con un número variable de argumentos, o con más argumentos que fueron formalmente declarados para aceptar. http://www.devguru.com/Technologies/Ecmascript/Quickref/arguments.html

El >>> es un cambio a la derecha sin signo. Se está utilizando aquí para convertir un número potencialmente firmado length en un número sin firmar.

Extract from Professional JavaScript for Web Developers

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

+0

Gracias, tiene sentido ahora. No me di cuenta de que la propiedad de longitud podría ser cualquier cosa menos unsigned, JavaScript me desconcierta a veces :) –

3

El /*, from */ es un parámetro opcional. Observe var from = Number(arguments[1]) || 0; después de eso. Si se pasó un segundo parámetro en la llamada a la función, la variable desde allí se configurará.

No estoy seguro acerca del desplazamiento a la derecha sin signo. No tiene ningún sentido para mí.

3

El /*, from*/ en la declaración de función es sólo un comentario por el autor quiere decir, que hay un segundo parámetro opcional llamado de. Se escribió como un comentario para que no sea parte de la firma (Array.prototype.indexOf.length devuelve 1).

Y el cambio a la derecha probablemente se usa para obtener siempre un valor entero de this.length.

Cuestiones relacionadas