Об'єкт 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 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
Дивіться також
- Посібник Функції
- Функції
- Решта параметрів