El arguments
objeto en JavaScript es una verruga extraña: actúa como una matriz en la mayoría de las situaciones, pero en realidad no es un objeto de matriz. Ya que es realmente algo completamente distinto , que no tiene las funciones útiles de Array.prototype
como forEach
, sort
, filter
, y map
.
Es trivialmente fácil construir una nueva matriz a partir de un objeto de argumentos con un bucle for simple. Por ejemplo, esta función ordena sus argumentos:
function sortArgs() {
var args = [];
for (var i = 0; i < arguments.length; i++)
args[i] = arguments[i];
return args.sort();
}
Sin embargo, esto es algo lamentable que debe hacerse simplemente para obtener acceso a las funciones de matriz de JavaScript extremadamente útiles. ¿Hay una forma integrada de hacerlo usando la biblioteca estándar?
javascript
arrays
sorting
arguments
variadic-functions
Andrew Coleson
fuente
fuente
Respuestas:
ES6 utilizando parámetros de descanso
Si puede usar ES6, puede usar:
Parámetros de descanso
Como puedes leer en el enlace
Si tiene curiosidad sobre la
...
sintaxis, se llama Spread Operator y puede leer más aquí .ES6 usando Array.from ()
Usando Array.from :
Array.from
simplemente convierta objetos Array o Iterable en instancias de Array.ES5
En realidad, solo puede usar
Array
laslice
función de un objeto de argumentos, y lo convertirá en una matriz estándar de JavaScript. Solo tendrá que hacer referencia a él manualmente a través del prototipo de Array:¿Por qué funciona esto? Bueno, aquí hay un extracto de la documentación de ECMAScript 5 :
Por lo tanto,
slice
funciona en todo lo que tiene unalength
propiedad, quearguments
convenientemente tiene.Si
Array.prototype.slice
es demasiado bocado para usted, puede abreviarlo ligeramente utilizando literales de matriz:Sin embargo, tiendo a sentir que la versión anterior es más explícita, por lo que preferiría en su lugar. Abusar de la notación literal de matriz se siente hacky y se ve extraño.
fuente
0
de? Dado que no hay argumentos que desee pasar, ¿por qué no puede simplemente usarvar args = Array.prototype.slice.call(arguments);
? [ La página de argumentos de MDC ] ( developer.mozilla.org/en/JavaScript/Reference/… ) sugiere el método sin el0
.function sortArgs(...argsToSort) { return argsToSort.sort(); }
de MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…También vale la pena hacer referencia a esta página wiki de la biblioteca Bluebird promete que muestra cómo administrar el
arguments
objeto en una matriz de manera que la función sea optimizable en el motor V8 JavaScript :Este método se utiliza a favor de
var args = [].slice.call(arguments);
. El autor también muestra cómo un paso de compilación puede ayudar a reducir la verbosidad.fuente
Algunos métodos de matriz se hacen intencionalmente para no requerir que el objeto de destino sea una matriz real. Solo requieren que el destino tenga una propiedad denominada longitud e índices (que deben ser enteros cero o mayores).
fuente
Utilizar:
Array(arg1, arg2, ...)
devoluciones[arg1, arg2, ...]
Array(str1)
devoluciones[str1]
Array(num1)
devuelve una matriz que tienenum1
elementos¡Debe verificar la cantidad de argumentos!
Array.slice
versión (más lenta):Array.push
versión (más lenta, más rápida que rebanada):Mover versión (más lenta, pero el tamaño pequeño es más rápido):
Array.concat
versión (más lenta):fuente
Si está utilizando jQuery, lo siguiente es mucho más fácil de recordar en mi opinión:
fuente
En ECMAScript 6 no hay necesidad de usar hacks feos como
Array.prototype.slice()
. En su lugar, puede usar la sintaxis spread (...
) .Puede parecer extraño, pero es bastante simple. Simplemente extrae
arguments
los elementos y los vuelve a colocar en la matriz. Si aún no entiende, vea estos ejemplos:Tenga en cuenta que no funciona en algunos navegadores antiguos como IE 11, por lo que si desea admitir estos navegadores, debe usar Babel .
fuente
Aquí hay un punto de referencia de varios métodos que convierten argumentos en una matriz.
En cuanto a mí, la mejor solución para una pequeña cantidad de argumentos es:
Para otros casos:
fuente
sortArgs
es 6 veces más rápido en Firefox, pero el doble de lento en el último Chrome, en comparación conArray.apply
.Recomiendo usar el operador de expansión ECMAScript 6 , que vinculará los parámetros finales a una matriz. Con esta solución no necesita tocar el
arguments
objeto y su código se simplificará. La desventaja de esta solución es que no funciona en la mayoría de los navegadores, por lo que deberá utilizar un compilador JS como Babel. Bajo el capó, Babel se transformaarguments
en una matriz con un bucle for.Si no puede usar un ECMAScript 6, le recomiendo ver algunas de las otras respuestas, como @Jonathan Fingland
fuente
Lodash
en acción:
produce:
fuente
_.toArray
?_.toArray
es más apropiado.Use
Array.from()
, que toma un objeto tipo matriz (comoarguments
) como argumento y lo convierte en matriz:Tenga en cuenta que no funciona en algunos navegadores antiguos como IE 11, por lo que si desea admitir estos navegadores, debe usar Babel .
fuente
fuente
Otra respuesta
Usa hechizos de magia negra:
Firefox, Chrome, Node.js, IE11 están bien.
fuente
__proto__
está en desuso. Ver documentos de MDN .Intenta usar
Object.setPrototypeOf()
Explicación: Conjunto
prototype
dearguments
aArray.prototype
Explicación: Tome cada índice de
arguments
, coloque el elemento en una matriz en el índice correspondiente de la matriz.alternativamente podría usar
Array.prototype.map()
Explicación: Tome cada índice de
arguments
, coloque el elemento en una matriz en el índice correspondiente de la matriz.for..of
lazoo
Object.create()
Explicación: Crear objeto, establecer propiedades de objeto a elementos en cada índice de
arguments
; conjuntoprototype
de objetos creados paraArray.prototype
fuente
Object.setPrototypeOf
advierte que es una "operación muy lenta". ¿Por qué demonios usaría estoArray.prototype.slice.call
?Aquí hay una solución limpia y concisa:
Object.values( )
devolverá los valores de un objeto como una matriz, y desdearguments
es un objeto, será esencialmente convertirarguments
en una matriz, lo que le proporciona todas las funciones de ayuda de una matriz tales comomap
,forEach
,filter
, etc.fuente
Benshmarck 3 métodos:
¿RESULTADO?
¡A disfrutar!
fuente
arguments.length == 1?[arguments[0]]:Array.apply(null, arguments);
para evitar que la función se llame con un solo argumento enterodummyFn(3)
y cause un resultado[,,]
dummyFn(3)
qué es esto? esta función no existe ...fuente
Aunque los parámetros de descanso funcionan bien, si desea continuar usándolo
arguments
por alguna razón, considere[...arguments]
puede considerarse una especie de alternativa aArray.from(arguments)
, que también funciona perfectamente bien.Una alternativa ES7 es una comprensión de matriz:
Esto podría ser más fácil si desea procesar o filtrar los argumentos antes de ordenar:
fuente
Intenté una técnica de destrucción simple
fuente
El objeto Argumentos solo está disponible dentro de un cuerpo de función. Aunque puede indexar el Objeto Argumentos como una matriz, no es una matriz. No tiene ninguna propiedad de matriz que no sea la longitud.
Aunque puede indexarse como una matriz, como puede ver en este ejemplo:
Sin embargo, el objeto Argumentos no es una matriz y no tiene ninguna otra propiedad que no sea la longitud.
Puede convertir el objeto de argumentos en una matriz en cuyo punto puede acceder al objeto Argumentos.
Hay muchas formas de acceder al objeto de argumentos dentro del cuerpo de una función, y estas incluyen:
Array.prototype.slice.call (argumentos)
[] .slice.call (argumentos).
fuente
Puede crear una función reutilizable para hacerlo con cualquier argumento, el más simple es algo como esto:
La sintaxis extendida se puede usar en ES6 y superior ...
Pero si desea usar algo compatible con ES5 y versiones posteriores, puede usarlo
Array.prototype.slice.call
, de modo que su código se verá así:También hay algunas otras formas de hacerlo, por ejemplo, usando
Array.from
o recorriendo los argumentos y asignándolos a una nueva matriz ...fuente
Esta es una pregunta muy antigua, pero creo que tengo una solución que es un poco más fácil de escribir que las soluciones anteriores y no se basa en bibliotecas externas:
fuente
Array.apply
no funcionará si solo tiene un argumento entero positivo. Es porquenew Array(3)
crea una longitud de matriz de3
. Para ser más específico, el resultado será[undefined, undefined, undefined]
y no[3]
.