Параметри за замовчуванням задають значення, якщо аргумент не передано:
function formatPrice(amount, currency = 'грн', digits = 2) {
return `${amount.toFixed(digits)} ${currency}`;
}
formatPrice(100); // '100.00 грн'
formatPrice(100, '$'); // '100.00 $'
Значення за замовчуванням спрацьовує лише для undefined, але не для null, 0 чи порожнього рядка:
formatPrice(100, undefined); // '100.00 грн'
formatPrice(100, null); // '100.00 null'
Значення обчислюється при кожному виклику і може посилатися на попередні параметри:
function createUser(name, slug = name.toLowerCase(), createdAt = new Date()) { /* ... */ }
Кожен виклик отримає нову дату чи новий масив (items = []) - на відміну від Python, де значення за замовчуванням створюється один раз.
Rest-параметри збирають «решту» аргументів у справжній масив:
function sum(...numbers) {
return numbers.reduce((total, n) => total + n, 0);
}
sum(1, 2, 3); // 6
function log(level, ...messages) {
console[level](...messages);
}
Rest-параметр може бути лише один і лише останнім.
Рядом - старий об'єкт arguments, псевдомасив усіх переданих аргументів. Він не має методів масиву, недоступний у стрілкових функціях і погано читається. У сучасному коді його замінюють rest-параметри.
Іменовані параметри через деструктуризацію - зручний прийом для функцій з багатьма необов'язковими налаштуваннями:
function fetchUsers({ page = 1, perPage = 20, sort = 'name' } = {}) { /* ... */ }
fetchUsers({ sort: 'created_at' });
fetchUsers(); // працює завдяки "= {}"
Порядок аргументів більше не важливий, а виклик сам себе документує. Без = {} наприкінці виклик без аргументів кине помилку: деструктуризувати undefined неможливо.
function.length рахує лише параметри до першого зі значенням за замовчуванням і без rest - деякі бібліотеки (каррування, DI) на це покладаються.