Búsqueda de sitios web

javascript - por qué `splice.apply(arguments, 0)` falla mientras `splice.call(arguments, 0)` devuelve Array


Estoy intentando convertir la variable arguments, que es accesible dentro de la función, en un arreglo. He intentado de dos maneras:

Array.prototype.splice.apply(arguments, 0) //fails
Array.prototype.splice.call(arguments, 0) //return array

¿Pueden por favor explicar por qué la primera opción falla mientras que la segunda tiene éxito?

Respuesta #1

Eso se debe a que Array.prototype.splice.apply(arguments, 0) es (aproximadamente) equivalente a arguments.splice([0]), como lo han dicho otros antes que yo, apply espera un Array como su segundo argumento. Si quisieras obtener los primeros n parámetros, podrías hacer Array.prototype.splice.apply(arguments, [0,n]), lo cual sería (aproximadamente) equivalente a arguments.splice.(0,n).

Por el contrario, call funciona con cualquier tipo de parámetros. Array.prototype.splice.call(arguments, 0) es (aproximadamente) equivalente a arguments.splice(0), y dado que splice espera un entero como su primer argumento y no un arreglo, la segunda solución funciona (pero la primera no). Por lo tanto, Array.prototype.splice.apply(arguments, [0]) también funcionaría como lo sugirió Jeroen Noten.

Tenga en cuenta que las "equivalencias" a las que me refiero no funcionarían realmente ya que arguments no es un Array sino un objeto parecido a un Array.

Sin embargo, la técnica que mencionaste se usa frecuentemente para convertir un objeto similar a un Array en un Array propiamente dicho.

EDITAR : Edité mi respuesta ya que contenía un gran error. Gracias a cookiemonster por la corrección.