una trivia respuestas quiz preguntas juego hacer examen curso con como javascript arrays arguments slice splice

trivia - Una pregunta sobre los métodos de división y empalme de JavaScript.



preguntas y respuestas en html (3)

Me encontré con el siguiente código:

var f = function () { var args = Array.prototype.slice.call(arguments).splice(1); // some more code };

Básicamente, el resultado en args es una matriz que es una copia de los arguments sin su primer elemento.

Pero lo que no puedo entender exactamente es por qué los arguments f (que es un objeto que contiene los argumentos ingresados ​​por la función en un objeto similar a una matriz) se pasan al método de slice y cómo slice(1) está eliminando la primera Elemento (posicionado en el índice 0).

¿Puede alguien explicármelo por favor?

PS El código es de esta función de aplicación parcial.


<Nota>
El código real de esa respuesta vinculada es:

var args = Array.prototype.slice.call(arguments, 1);

es decir, "rebanada", no "empalme"
</Note>

En primer lugar, el método de slice se usa a menudo para hacer una copia de la matriz a la que se llama :

var a = [''a'', ''b'', ''c'']; var b = a.slice(); // b is now a copy of a var c = a.slice(1); // c is now [''b'', ''c'']

Así que la respuesta corta es que el código básicamente está emulando:

arguments.slice(1); // discard 1st argument, gimme the rest

Sin embargo, no puedes hacer eso directamente. El objeto de arguments especiales (disponible dentro del contexto de ejecución de todas las funciones de JavaScript), aunque es similar a Array porque admite la indexación a través del operador [] con teclas numéricas, no es realmente un Array; No se puede .push , quitarse, o .slice , etc.

La forma en que el código logra esto es "engañando" a la función de slice (que de nuevo no está disponible en el objeto de arguments ) para que se ejecute en el contexto de los arguments , a través de Function.prototype.call :

Array.prototype.slice // get a reference to the slice method // available on all Arrays, then... .call( // call it, ... arguments, // making "this" point to arguments inside slice, and... 1 // pass 1 to slice as the first argument )

Array.prototype.slice.call(arguments).splice(1) logra lo mismo, pero realiza una llamada extraña al splice(1) , que elimina elementos de la matriz devuelta desde Array.prototype.slice.call(arguments) comenzando en el índice 1 y continuando hasta el final de la matriz. splice(1) no funciona en IE (técnicamente le falta un segundo parámetro que le dice cuántos elementos para eliminar que IE y ECMAScript requieren).


El valor devuelto de un empalme es una matriz de los elementos que se eliminaron, pero la matriz original (u objeto similar a una matriz) se trunca en el índice de empalme.

Al hacer una copia con una porción, se conserva la matriz de argumentos original, probablemente para usar más adelante en la función.

En este caso, se puede obtener el mismo resultado con args = [].slice.call(arguments, 1)

function handleArguments(){ var A= [].slice.call(arguments).splice(1); //arguments is unchanged var s= ''A=''+A+''/narguments.length=''+arguments.length; var B= [].splice.call(arguments, 1); // arguments now contains only the first parameter s+= ''/n/nB=''+B+''/narguments.length=''+arguments.length; return s; } // test alert(handleArguments(1, 2, 3, 4)); returned value: //var A= [].slice.call(arguments).splice(1); A=2,3,4 arguments.length=4 //var B= [].splice.call(arguments, 1); B=2,3,4 arguments.length=1


var args = Array.prototype.slice.call(arguments).splice(1);

Primero toma una copia de los arguments (*), luego elimina todos los elementos excepto el primer elemento (de una manera no estándar) y asigna aquellos elementos que se eliminan a args .

La matriz adicional que se produce, luego se altera y se desecha es bastante redundante. Sería mejor decirlo, ya que la versión en la respuesta a la que está vinculado hace:

var args = Array.prototype.slice.call(arguments, 1);

La aplicación de función parcial también es una característica del método function.bind , que está estandarizada por ECMAScript Quinta edición. Hasta que los navegadores lo hayan implementado, puede obtener una versión JS-Native alternativa desde el final de esta respuesta .

*: array.slice() es el idioma normal para copiar una matriz, y array.slice(1) para tomar la cola. Tiene que ser llamado explícitamente a través del Array.prototype porque los arguments no son Array, aunque se parece a uno, por lo que no tiene los métodos de array normales. Este es otro de los errores extraños de JavaScript.

Muy a menudo se ve gente que usa los métodos de Array.prototype en objetos que no son Arrays; El estándar ECMAScript Tercera Edición hace un esfuerzo para decir que está bien hacerlo con los arguments matriz, pero no es posible que también lo haga con otros gustos de matriz que pueden ser objetos de host, como NodeList o HTMLCollection. Aunque podría salirse con la suya al llamar a los métodos de Array.prototype en un sistema que no sea Array en muchos navegadores de hoy, el único lugar en el que es seguro hacerlo es en los arguments .