Пошук уроків, статей та іншого контенту
Параметри за замовчуванням, rest-параметри та деструктуризація прямо в параметрах функції.
Реальні функції рідко мають фіксовану, наперед відому кількість аргументів: іноді значення можна не передавати (тоді підставляється розумне значення за замовчуванням), іноді кількість аргументів наперед невідома (сума довільної кількості чисел), а іноді зручніше передати один об'єкт із іменованими полями, ніж довгий список позиційних аргументів, у якому легко переплутати порядок. Наступні три можливості мови вирішують саме ці три ситуації.
До ES2015 відсутній аргумент означав undefined, і значення за замовчуванням доводилось виставляти вручну всередині функції. Тепер це частина синтаксису:
function greet(name = "Гість") {
return `Привіт, ${name}!`;
}
greet(); // "Привіт, Гість!"
greet("Олена"); // "Привіт, Олена!"
greet(undefined); // "Привіт, Гість!" — так само спрацює на undefinedЗначення за замовчуванням застосовується лише для undefined — якщо явно передати null або 0, вони залишаться як є, значення за замовчуванням не підставиться.
Коли функція має приймати довільну кількість аргументів, ...rest збирає їх усі в звичайний масив:
function sum(...numbers) {
return numbers.reduce((total, n) => total + n, 0);
}
sum(1, 2, 3); // 6
sum(1, 2, 3, 4, 5); // 15Rest-параметр обов'язково має бути останнім у списку параметрів — після нього нічого оголосити не можна: function f(a, ...rest, b) є синтаксичною помилкою.
До rest-параметрів усередині звичайних функцій (не стрілкових) був доступний псевдомасив arguments з усіма переданими аргументами. Він досі працює, але має гірший API (не має методів масиву напряму) і не існує в стрілкових функціях узагалі — rest-параметри є сучасною заміною для нового коду.
Коли функція приймає об'єкт з конкретними полями, можна деструктурувати його прямо в сигнатурі — детальніше про деструктуризацію в наступному модулі, але базовий патерн вартий уваги вже тут:
function createUser({ name, age = 18 }) {
return `${name}, ${age} років`;
}
createUser({ name: "Максим" }); // "Максим, 18 років"
createUser({ name: "Ірина", age: 25 }); // "Ірина, 25 років"Очікування, що значення за замовчуванням підставиться і для null — воно спрацьовує лише для undefined.
Спроба поставити rest-параметр не останнім у списку.
Змішування arguments зі стрілковими функціями — arguments там просто не існує, посилається на зовнішню функцію.
Параметри за замовчуванням підставляють значення лише для undefined, rest-параметри збирають довільну кількість аргументів у звичайний масив, а деструктуризація прямо в сигнатурі дозволяє приймати об'єкт з іменованими полями замість довгого списку позиційних аргументів. Разом ці три можливості покривають переважну більшість реальних сценаріїв виклику функції з гнучкою кількістю чи формою аргументів.
Спробуйте самостійно
Напишіть функцію createPost({ title, tags = [] }), яка повертає об'єкт із заголовком і масивом тегів, підставляючи порожній масив, якщо теги не передали.