--- title: Oggetto 'arguments' slug: Web/JavaScript/Reference/Functions/arguments translation_of: Web/JavaScript/Reference/Functions/arguments original_slug: Web/JavaScript/Reference/Functions_and_function_scope/arguments ---
L'oggetto arguments
è un oggetto Array
-like corrispondente agli argomenti passati in una funzione
{{EmbedInteractiveExample("pages/js/functions-arguments.html")}}
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.
arguments
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 {{jsxref("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
.
typeof
con ArgumentsIl 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.
Come è possibile fare con qualsiasi oggetto Array-like, si può usare il metodo {{jsxref("Array.from()")}} o lo spread operator per convertire arguments in un vero Array:
var args = Array.from(arguments); var args = [...arguments];
arguments.callee
arguments.caller
{{ Obsolete_inline() }}arguments.length
arguments[@@iterator]
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');
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>" */
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
Specification | Status | Comment |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Definizione iniziale. Impelementata in JavaScript 1.1 |
{{SpecName('ES5.1', '#sec-10.6', 'Arguments Object')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES2015', '#sec-arguments-exotic-objects', 'Arguments Exotic Objects')}} | {{Spec2('ES2015')}} | |
{{SpecName('ESDraft', '#sec-arguments-exotic-objects', 'Arguments Exotic Objects')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.functions.arguments")}}