Come saprete, non esiste un metodo nativo per ottenere sia "argomenti passati AND valori predefiniti in cui gli argomenti non vengono passati". Ma c'è una soluzione:
Questa funzione (che ho trovato here) riceve tutti i parametri di una determinata funzione:
function getArgs(func) {
var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
return args.split(',').map(function(arg) {
return arg.replace(/\/\*.*\*\//, '').trim();
}).filter(function(arg) {
return arg;
});
};
Quindi, combinando questa funzione con l'arguments
della funzione myFunction
, possiamo ottenere un matrice che ha ciò che si vuole:
function myFunction (arg1, arg2 = "bob") {
var thisArguments = arguments;
console.log(getArgs(myFunction, thisArguments));
};
function getArgs(func, argums) {
var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
var argsArray = args.split(',').map(function(arg) {
return arg.replace(/\/\*.*\*\//, '').trim();
}).filter(function(arg) {
return arg;
});
for(var i = 0; i < argsArray.length; i++){
argsArray[i] += " (default)";
}
var defaults = argsArray.slice(argums.length);
argums = Array.prototype.slice.call(argums);
return argums.concat(defaults);
};
Ora, possiamo vedere le informazioni nella console chiamando myFunction
:
1. Passare più argomenti dei parametri
Ciò restituirà solo gli argomenti.
myFunction("foo", "bar", "baz");
//returns: ["foo", "bar", "baz"]
2. Passando meno argomenti di parametri
Tornerà gli argomenti ed i parametri di default resto, come si desidera (ho aggiunto "default" per ogni stringa).
myFunction("foo");
//returns ["foo", "arg2 = "bob" (default)"]
3. Passando senza argomenti
Ciò restituirà tutti i parametri.
myFunction();
//returns ["arg1 (default)", "arg2 = "bob" (default)"]
Questo è il violino: https://jsfiddle.net/gerardofurtado/25jxrkm8/1/
Ho aggiornato la mia risposta, solo per divertimento ... a dare un'occhiata. –