Об'єкт arguments

arguments – це масивоподібний об'єкт, доступний всередині функцій, який містить значення аргументів, переданих поточній функції.

Спробуйте його в дії

Опис

[!NOTE] У сучасному коді краще віддавати перевагу решті параметрів.

Об'єкт arguments – це локальна змінна, доступна всередині всіх нестрілкових функцій. Всередині такої функції можна звертатися до її аргументів за допомогою її об'єкта arguments. Він містить записи для кожного аргументу, з яким була викликана функція, а перший запис має індекс 0.

Наприклад, якщо функції передано 3 аргументи, до них можна звертатися так:

arguments[0]; // перший аргумент
arguments[1]; // другий аргумент
arguments[2]; // третій аргумент

Об'єкт arguments корисний для функцій, які викликаються з більшою кількістю аргументів, ніж їм формально дозволено отримувати, – такі функції звуться варіативними, серед них, наприклад, Math.min(). У цьому прикладі функція приймає будь-яку кількість рядкових аргументів і повертає найдовший з них:

function longestString() {
  let longest = "";
  for (let i = 0; i < arguments.length; i++) {
    if (arguments[i].length > longest.length) {
      longest = arguments[i];
    }
  }
  return longest;
}

Можна скористатися arguments.length, щоб полічити, зі скількома аргументами була викликана функція. Якщо ж потрібно полічити, скільки параметрів функція має в оголошенні, слід звернутися до властивості length цієї функції.

Присвоєння за індексами

Кожен індекс аргументу також можна задати або перезаписати:

arguments[1] = "нове значення";

Несуворі функції, що мають лише прості параметри (тобто не мають решти, усталених параметрів або їх деструктурування), синхронізують і нове значення параметрів з об'єктом arguments, і навпаки:

function func(a) {
  arguments[0] = 99; // оновлення arguments[0] також змінює a
  console.log(a);
}
func(10); // 99

function func2(a) {
  a = 99; // оновлення a також змінює arguments[0]
  console.log(arguments[0]);
}
func2(10); // 99

Несуворі функції, до яких було передано решту, усталені або деструктуровані параметри, не синхронізують нові значення, присвоєні параметрам у тілі функції, з об'єктом arguments. Замість цього об'єкт arguments у несуворих функцій зі складними параметрами завжди відображатиме значення, передані функції під час її виклику.

function funcWithDefault(a = 55) {
  arguments[0] = 99; // оновлення arguments[0] не впливає на a
  console.log(a);
}
funcWithDefault(10); // 10

function funcWithDefault2(a = 55) {
  a = 99; // оновлення a не впливає на arguments[0]
  console.log(arguments[0]);
}
funcWithDefault2(10); // 10

// Невідстежуваний усталений параметр
function funcWithDefault3(a = 55) {
  console.log(arguments[0]);
  console.log(arguments.length);
}
funcWithDefault3(); // undefined; 0

Цю саму поведінку демонструють усі функції суворого режиму, незалежно від типів параметрів, які їм передаються. Тобто присвоєння нових значень до параметрів у тілі функції ніколи не впливає на об'єкт arguments, і так само присвоєння нових значень за індексами arguments не впливає на значення параметрів, навіть якщо функція має лише прості параметри.

[!NOTE] Не можна вписати директиву "use strict"; у тіло визначення функції, що приймає решту, усталені або деструктуровані параметри. Це призведе до викидання синтаксичної помилки.

arguments – це масивоподібний об'єкт

arguments – це масивоподібний об'єкт, тобто arguments має властивість length і властивості з індексами від нуля, але не має вбудованих методів Array, як-от forEach() або map(). Однак його можна перетворити на справжній масив за допомогою slice(), Array.from() або синтаксису розгортання.

const args = Array.prototype.slice.call(arguments);
// або
const args = Array.from(arguments);
// або
const args = [...arguments];

Для поширених ситуацій достатньо використовувати arguments як масивоподібний об'єкт, оскільки він водночас є ітерованим і має властивість length та числові індекси. Наприклад, метод apply() приймає масивоподібні об'єкти.

function midpoint() {
  return (
    (Math.min.apply(null, arguments) + Math.max.apply(null, arguments)) / 2
  );
}

console.log(midpoint(3, 1, 4, 1, 5)); // 3

Властивості

arguments.callee

Посилання на поточну функцію, до якої належать аргументи. Заборонено в суворому режимі.

arguments.length

Число аргументів, що були передані функції.

arguments[Symbol.iterator]()

Повертає новий об'єкт ітератора масиву, що містить значення для кожного індексу arguments.

Приклади

Визначення функції, що з'єднує докупи декілька рядків

Цей приклад визначає функцію, що з'єднує докупи декілька рядків. Її єдиний формальний аргумент – це рядок символів між з'єднуваними елементами.

function myConcat(separator) {
  const args = Array.prototype.slice.call(arguments, 1);
  return args.join(separator);
}

Можна передати цій функції скільки завгодно аргументів. Вона повертає рядок, що містить рядковий список, утворений з кожного аргументу списку:

myConcat(", ", "червоний", "помаранчевий", "синій");
// "червоний, помаранчевий, синій"

myConcat("; ", "слон", "жирафа", "лев", "гепард");
// "слон; жирафа; лев; гепард"

myConcat(". ", "шавлія", "базилік", "орегано", "перець", "петрушка");
// "шавлія. базилік. орегано. перець. петрушка"

Визначення функції, що створює списки HTML

Цей приклад визначає функцію, що створює рядок, який містить HTML для списку. Її єдиний формальний аргумент – це рядок, що містить "u", якщо список має бути невпорядкованим (з маркерами), або "o", якщо список має бути упорядкованим (з номерами). Функція визначається так:

function list(type) {
  let html = `<${type}l><li>`;
  const args = Array.prototype.slice.call(arguments, 1);
  html += args.join("</li><li>");
  html += `</li></${type}l>`; // закінчити список
  return html;
}

До цієї функції можна передати будь-яку кількість аргументів, і вона додасть кожен аргумент як елемент списку до списку вказаного типу. Наприклад:

list("u", "Один", "Два", "Три");
// "<ul><li>Один</li><li>Два</li><li>Три</li></ul>"

Застосування typeof до arguments

Оператор typeof повертає 'object' для arguments:

console.log(typeof arguments); // 'object'

Типи окремих аргументів можна з'ясувати, проіндексувавши arguments:

console.log(typeof arguments[0]); // повертає тип першого аргументу

Специфікації

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
arguments
Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 3
Opera Full support 3
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0
@@iterator Chrome Full support 52
Edge Full support 12
Firefox Full support 46
Internet Explorer No support Ні
Opera Full support 39
Safari Full support 9
WebView Android Full support 52
Chrome Android Full support 52
Firefox for Android Full support 46
Opera Android Full support 41
Safari on iOS Full support 9
Samsung Internet Full support 6.0
Deno Full support 1.0
Node.js Full support 4.0.0
callee Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 6
Opera Full support 4
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0
length Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 4
Opera Full support 4
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0

Дивіться також