--- title: The arguments object slug: Web/JavaScript/Reference/Functions/arguments page-type: javascript-language-feature browser-compat: javascript.functions.arguments sidebar: jssidebar --- **`arguments`** is an array-like object accessible inside [functions](/en-US/docs/Web/JavaScript/Guide/Functions) that contains the values of the arguments passed to that function. {{InteractiveExample("JavaScript Demo: The arguments object")}} ```js interactive-example function func1(a, b, c) { console.log(arguments[0]); // Expected output: 1 console.log(arguments[1]); // Expected output: 2 console.log(arguments[2]); // Expected output: 3 } func1(1, 2, 3); ``` ## Description > [!NOTE] > In modern code, [rest parameters](/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters) should be preferred. The `arguments` object is a local variable available within all non-[arrow](/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) functions. You can refer to a function's arguments inside that function by using its `arguments` object. It has entries for each argument the function was called with, with the first entry's index at `0`. For example, if a function is passed 3 arguments, you can access them as follows: ```js arguments[0]; // first argument arguments[1]; // second argument arguments[2]; // third argument ``` The `arguments` object is useful for functions called with more arguments than they are formally declared to accept, called [_variadic functions_](https://en.wikipedia.org/wiki/Variadic_function), such as {{jsxref("Math.min()")}}. This example function accepts any number of string arguments and returns the longest one: ```js function longestString() { let longest = ""; if (arguments.length === 0) { throw new TypeError("At least one string is required"); } for (const arg of arguments) { if (arg.length > longest.length) { longest = arg; } } return longest; } ``` You can use {{jsxref("Functions/arguments/length", "arguments.length")}} to count how many arguments the function was called with. If you instead want to count how many parameters a function is declared to accept, inspect that function's {{jsxref("Function/length", "length")}} property. ### Assigning to indices Each argument index can also be set or reassigned: ```js arguments[1] = "new value"; ``` Non-strict functions that only have simple parameters (that is, no rest, default, or destructured parameters) will sync the new value of parameters with the `arguments` object, and vice versa: ```js function func(a) { arguments[0] = 99; // updating arguments[0] also updates a console.log(a); } func(10); // 99 function func2(a) { a = 99; // updating a also updates arguments[0] console.log(arguments[0]); } func2(10); // 99 ``` Non-strict functions that _are_ passed [rest](/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters), [default](/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters), or [destructured](/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring) parameters will not sync new values assigned to parameters in the function body with the `arguments` object. Instead, the `arguments` object in non-strict functions with complex parameters will always reflect the values passed to the function when the function was called. ```js function funcWithDefault(a = 55) { arguments[0] = 99; // updating arguments[0] does not also update a console.log(a); } funcWithDefault(10); // 10 function funcWithDefault2(a = 55) { a = 99; // updating a does not also update arguments[0] console.log(arguments[0]); } funcWithDefault2(10); // 10 // An untracked default parameter function funcWithDefault3(a = 55) { console.log(arguments[0]); console.log(arguments.length); } funcWithDefault3(); // undefined; 0 ``` This is the same behavior exhibited by all [strict-mode functions](/en-US/docs/Web/JavaScript/Reference/Strict_mode#making_eval_and_arguments_simpler), regardless of the type of parameters they are passed. That is, assigning new values to parameters in the body of the function never affects the `arguments` object, nor will assigning new values to the `arguments` indices affect the value of parameters, even when the function only has simple parameters. > [!NOTE] > You cannot write a `"use strict";` directive in the body of a function definition that accepts rest, default, or destructured parameters. Doing so will throw [a syntax error](/en-US/docs/Web/JavaScript/Reference/Errors/Strict_non_simple_params). ### arguments is an array-like object `arguments` is an array-like object, which means that `arguments` has a {{jsxref("Functions/arguments/length", "length")}} property and properties indexed from zero, but it doesn't have {{jsxref("Array")}}'s built-in methods like {{jsxref("Array/forEach", "forEach()")}} or {{jsxref("Array/map", "map()")}}. However, it can be converted to a real `Array`, using one of [`slice()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice), {{jsxref("Array.from()")}}, or [spread syntax](/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax). ```js const args = Array.prototype.slice.call(arguments); // or const args = Array.from(arguments); // or const args = [...arguments]; ``` For common use cases, using it as an array-like object is sufficient, since it both [is iterable](/en-US/docs/Web/JavaScript/Reference/Functions/arguments/Symbol.iterator) and has `length` and number indices. For example, [`Function.prototype.apply()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) accepts array-like objects. ```js function midpoint() { return ( (Math.min.apply(null, arguments) + Math.max.apply(null, arguments)) / 2 ); } console.log(midpoint(3, 1, 4, 1, 5)); // 3 ``` ## Properties - {{jsxref("Functions/arguments/callee", "arguments.callee")}} {{deprecated_inline}} - : Reference to the currently executing function that the arguments belong to. Forbidden in strict mode. - {{jsxref("Functions/arguments/length", "arguments.length")}} - : The number of arguments that were passed to the function. - [`arguments[Symbol.iterator]()`](/en-US/docs/Web/JavaScript/Reference/Functions/arguments/Symbol.iterator) - : Returns a new [array iterator](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.iterator) object that contains the values for each index in `arguments`. ## Examples ### Defining a function that concatenates several strings This example defines a function that concatenates several strings. The function's only formal argument is a string containing the characters that separate the items to concatenate. ```js function myConcat(separator) { const args = Array.prototype.slice.call(arguments, 1); return args.join(separator); } ``` You can pass as many arguments as you like to this function. It returns a string list using each argument in the list: ```js myConcat(", ", "red", "orange", "blue"); // "red, orange, blue" myConcat("; ", "elephant", "giraffe", "lion", "cheetah"); // "elephant; giraffe; lion; cheetah" myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley"); // "sage. basil. oregano. pepper. parsley" ``` ### Defining a function that creates HTML lists This example defines a function that creates a string containing HTML for a list. The only formal argument for the function is a string that is `"u"` if the list is to be [unordered (bulleted)](/en-US/docs/Web/HTML/Reference/Elements/ul), or `"o"` if the list is to be [ordered (numbered)](/en-US/docs/Web/HTML/Reference/Elements/ol). The function is defined as follows: ```js function list(type) { let html = `<${type}l>