2016-06-08 13 views
7

Se ho questa dichiarazione della funzione ES6 e invocazione:I valori predefiniti ES6 non sono disponibili in function.arguments?

function myFunction (arg1, arg2 = "bob") { 
    console.log("arguments", arguments); 
} 

myFunction(1); 

... la dichiarazione console.log() mostra solo un argomento con un valore di "1". "bob" non si vede da nessuna parte. Questo comportamento atteso e/o desiderato? Mi aspetto che i valori predefiniti siano disponibili nell'oggetto arguments. In caso contrario, c'è un modo per ottenere in modo dinamico tutti gli argomenti + i default in qualche altro modo?

Grazie in anticipo!

+0

Ho aggiornato la mia risposta, solo per divertimento ... a dare un'occhiata. –

risposta

9

Sì, questo è previsto e desiderato. L'oggetto arguments è un elenco dei valori passati nella funzione, nient'altro.

Non è collegato in modo implicito alle variabili parametro (che vengono assegnate ai valori predefiniti), come se fosse in modalità sciatta.

C'è un modo per ottenere in modo dinamico tutti gli argomenti + valori predefiniti in qualche altro modo?

No. I parametri che hai e se hanno inizializzatori di default sono statici, non devi fare nulla qui dinamicamente. Puoi fare Object.assign([], arguments, [arg1, arg2]) per la tua funzione di esempio.

+0

Grazie. Quindi vuol dire che non c'è modo di ottenere un oggetto di "argomenti passati e valori predefiniti in cui gli argomenti non vengono passati"? – hairbo

+0

La soluzione 'Object.assign' è carina - stavo pensando di controllare lunghezze di matrici e splicing ecc. Per gestirlo. –

+0

@JamesThorpe: l'alternativa semplice qui è 'var args = Array.from (argomenti); args [1] = arg2; ' – Bergi

1

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/

+1

Questo è un po 'interessante. Grazie! – hairbo

+0

Anche interessante aggiornamento, anche se sembra che il risultato non abbia i valori effettivi delle variabili in un formato terribilmente utilizzabile, giusto? – hairbo

Problemi correlati