javascript - valor - ¿Es posible obtener todos los argumentos de una función como un solo objeto dentro de esa función?
pasar parametros a una funcion javascript desde html (9)
Como muchos otros señalaron, los arguments
contienen todos los argumentos pasados a una función.
Si desea llamar a otra función con los mismos argumentos, use apply
Ejemplo:
var is_debug = true;
var debug = function() {
if (is_debug) {
console.log.apply(console, arguments);
}
}
debug("message", "another argument")
En PHP hay func_num_args
y func_get_args
, ¿hay algo similar para JavaScript?
ES6 permite una construcción donde se especifica un argumento de función con una notación "..." como
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
El objeto de arguments
es donde se almacenan los argumentos de funciones.
El objeto de argumentos actúa y parece una matriz, básicamente es, simplemente no tiene los métodos que tienen las matrices, por ejemplo:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.indexOf(searchElement[, fromIndex])
Creo que la mejor manera de convertir un objeto de arguments
en una matriz real es así:
argumentsArray = [].slice.apply(arguments);
Eso lo convertirá en una matriz;
reutilizable
function ArgumentsToArray(args) {
return [].slice.apply(args);
}
(function() {
args = ArgumentsToArray(arguments);
args.forEach(function(value) {
console.log(''value ==='', value);
});
})(''name'', 1, {}, ''two'', 3)
resultado:
>
value === name
>value === 1
>value === Object {}
>value === two
>value === 3
En ES6, use Array.from
.
function foo()
{
foo.bar = Array.from(arguments);
foo.baz = foo.bar.join();
}
foo(1,2,3,4,5,6,7);
foo.bar // Array [1, 2, 3, 4, 5, 6, 7]
foo.baz // "1,2,3,4,5,6,7"
Para código no ES6, use JSON.stringify y JSON.parse:
function foo()
{
foo.bar = JSON.stringify(arguments);
foo.baz = JSON.parse(foo.bar);
}
/* Atomic Data */
foo(1,2,3,4,5,6,7);
foo.bar // "{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7}"
foo.baz // [object Object]
/* Structured Data */
foo({1:2},[3,4],/5,6/,Date())
foo.bar //"{"0":{"1":2},"1":[3,4],"2":{},"3":"Tue Dec 17 2013 16:25:44 GMT-0800 (Pacific Standard Time)"}"
foo.baz // [object Object]
Si se necesita preservación en lugar de la estratificación, use el algoritmo de clonación estructurado interno .
Si se pasan nodos DOM, use XMLSerializer como en una pregunta no relacionada .
with (new XMLSerializer()) {serializeToString(document.documentElement) }
Si se ejecuta como un marcador, es posible que deba ajustar cada argumento de datos estructurados en un constructor de errores para que JSON.stringify
funcione correctamente.
Referencias
Los argumentos son un objeto similar a una matriz (no una matriz real). Ejemplo de función ...
function testArguments () // <-- notice no arguments specified
{
console.log(arguments); // outputs the arguments to the console
var htmlOutput = "";
for (var i=0; i < arguments.length; i++) {
htmlOutput += ''<li>'' + arguments[i] + ''</li>'';
}
document.write(''<ul>'' + htmlOutput + ''</ul>'');
}
Pruébalo...
testArguments("This", "is", "a", "test"); // outputs ["This","is","a","test"]
testArguments(1,2,3,4,5,6,7,8,9); // outputs [1,2,3,4,5,6,7,8,9]
Los detalles completos: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
Respuesta similar a Gunnar, con un ejemplo más completo: incluso puede devolver todo de forma transparente:
function dumpArguments(...args) {
for (var i = 0; i < args.length; i++)
console.log(args[i]);
return args;
}
dumpArguments("foo", "bar", true, 42, ["yes", "no"], { ''banana'': true });
Salida:
foo
bar
true
42
["yes","no"]
{"banana":true}
https://codepen.io/fnocke/pen/mmoxOr?editors=0010
Sí, si no tiene idea de cuántos argumentos son posibles en el momento de la declaración de la función, entonces puede declarar la función sin parámetros y puede acceder a todas las variables mediante la matriz de argumentos que se pasan al momento de la llamada de la función.
También puedes convertirlo a una matriz si lo prefieres. Si Array genéricos están disponibles:
var args = Array.slice(arguments)
De otra manera:
var args = Array.prototype.slice.call(arguments);
de arguments :
No debe dividir los argumentos porque evita las optimizaciones en los motores de JavaScript (V8 por ejemplo).
Usa arguments
. Puedes acceder a él como una matriz. Use arguments.length
para el número de argumentos.