Oggetto 'arguments'
L'oggetto arguments
è un oggetto Array
-like corrispondente agli argomenti passati in una funzione
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Il codice sorgente di questo esempio interattivo è ospitato in un repository di Github.
Se vuoi contribuire al progetto di esempi interattivi, per favore clona https://github.com/mdn/interactive-examples and send us a pull request.
Sintassi
arguments
Descrizione
L'oggetto arguments
è una variabile locale disponibile in tutte le funzioni (non-arrow). Si può fare riferimento agli argomenti di una funzione, al suo interno, usando l'oggetto arguments
. Questo oggetto contiene un elemento per ogni argomento passato alla funzione, il primo elemento è indicizzato a 0. Per esempio, se a una funzione sono passati tre argomenti, ci si può riferire ad essi come segue:
arguments[0]
arguments[1]
arguments[2]
Gli argomenti possono anche essere settati:
arguments[1] = 'nuovo valore';
L'oggetto arguments
non è un Array
. E' simile a un Array
, ma non ha le proprietà dell'Array,
eccetto length
. Per esempio, non ha il metodo pop
. Tuttavia può essere convertito in un vero Array
:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
Usare slice su arguments impedisce le ottimizzazioni in alcuni motori JavaScript (per esempio V8 - più informazioni). Se ne avete bisogno, provate a costruire un nuovo array iterando sull'oggetto arguments, piuttosto. Un'alternativa potrebbe essere usare l'odiato costruttore Array
come una funzione:
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
Si può usare l'oggetto arguments
se si chiama una funzione con più argomenti di quanti la funzione dichiari formalmente di accettare. Questa tecnica è utile per le funzioni cui possono essere passati un numero variabile di argomenti. Si usi arguments.length
per determinare il numero di argomenti passati alla funzione, e quindi si processi ogni argomento usando l'oggetto arguments
. Per determinare il numero di parametri presenti nella dichiarazione di una funzione, si usi la proprietà Function.length
.
Usare typeof
con Arguments
Il typeof di arguments ritorna 'object'.
console.log(typeof arguments); // 'object'
Il typeof di ogni signolo argomento può essere determinato con l'uso degli indici.
console.log(typeof arguments[0]); //this will return the typeof individual arguments.
Usare la sintassi Spread con Arguments
Come è possibile fare con qualsiasi oggetto Array-like, si può usare il metodo Array.from()
o lo spread operator per convertire arguments in un vero Array:
var args = Array.from(arguments);
var args = [...arguments];
Proprietà
arguments.callee
- Riferimento alla funzione in esecuzione.
arguments.caller
- Riferimento alla funzione che ha invocato la funzione in esecuzione.
arguments.length
- Riferimento al numero di argomenti passati alla funzione.
arguments[@@iterator]
- Ritorna un nuovo oggetto Array Iterator che contiene i valori per ogni indice in arguments.
Esempi
Definire una funzione che concatena divere stringhe
Questo esempio definisce una funzione che concatena diverse stringhe. L'unico argomento formale per la funzione è una stringa che specifica il carattere di separazione per gli elementi da concatenare. La funzione si definisce come segue:
function myConcat(separator) {
var args = Array.prototype.slice.call(arguments, 1);
return args.join(separator);
}
Si può passare un numero indefinito di argomenti a questa funzione, e lei creerà una lista inserendo ciascun argomento come item della lista.
// returns "red, orange, blue"
myConcat(', ', 'red', 'orange', 'blue');
// returns "elephant; giraffe; lion; cheetah"
myConcat('; ', 'elephant', 'giraffe', 'lion', 'cheetah');
// returns "sage. basil. oregano. pepper. parsley"
myConcat('. ', 'sage', 'basil', 'oregano', 'pepper', 'parsley');
Definire una funzione che crea liste HTML
Questo esempio definisce una funzione che crea una stringa contenente l'HTML di una lista. L'unico argomento formale della funzione è una stringa che è "u
" se la lista deve essere ordinata, e "o
" se la lista deve essere ordinata (numerata). La funzione è definita come segue:
function list(type) {
var result = '<' + type + 'l><li>';
var args = Array.prototype.slice.call(arguments, 1);
result += args.join('</li><li>');
result += '</li></' + type + 'l>'; // end list
return result;
}
Si può passare un numero indefinito di argomenti a questa funzione, e lei aggiungerà ogni argomento come un elemento della lista del tipo indicato. Per esempio:
var listHTML = list('u', 'One', 'Two', 'Three');
/* listHTML is:
"<ul><li>One</li><li>Two</li><li>Three</li></ul>"
*/
Parametri rest, default, e destructured
L'oggetto arguments
può essere usato insieme a parametri rest, default, e destructured.
function foo(...args) {
return args;
}
foo(1, 2, 3); // [1,2,3]
Sebbene la presenza di parametri rest, default, o destructured non altera il comportamento dell'oggetto arguments
nel codice scritto in strict mode, c'è una sottile differenza tra modalità strict e non-strict.
Quando una funzione non-strict non contiene parametri rest, default, o destructured, allora i valori nell'oggetto arguments
tracciano il valore degli argomenti (e vice versa). Si guardi il codice qui sotto:
function func(a) {
arguments[0] = 99; // updating arguments[0] also updates a
console.log(a);
}
func(10); // 99
e
function func(a) {
a = 99; // updating a also updates arguments[0]
console.log(arguments[0]);
}
func(10); // 99
Quando una funzione non-strict contiene parametri rest, default, o destructured, allora i valori nell'oggetto arguments
non tracciano il valore degli argomenti (e vice versa). Al contrario, riflettono gli argomenti forniti al momento dell'invocazione:
function func(a = 55) {
arguments[0] = 99; // updating arguments[0] does not also update a
console.log(a);
}
func(10); // 10
e
function func(a = 55) {
a = 99; // updating a does not also update arguments[0]
console.log(arguments[0]);
}
func(10); // 10
e
function func(a = 55) {
console.log(arguments[0]);
}
func(); // undefined
Specifiche
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition (ECMA-262) | Standard | Definizione iniziale. Impelementata in JavaScript 1.1 |
ECMAScript 5.1 (ECMA-262) The definition of 'Arguments Object' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Arguments Exotic Objects' in that specification. |
Standard | |
ECMAScript (ECMA-262) The definition of 'Arguments Exotic Objects' in that specification. |
Living Standard |
Browser compatibility
BCD tables only load in the browser