Опишем функцию greeting
, которая печатает на экран приветствие:
const greeting = (name) => console.log(`Hi, ${name}!`);
greeting('John');
// => Hi, John!
Но что произойдет, если при вызове функции передать ей меньшее число аргументов, чем у нее установлено параметров? Давайте посмотрим:
greeting();
// => Hi, undefined!
Правило здесь простое: параметры, которым "не досталось" аргумента, автоматически инициализируются значением undefined
. Проиллюстрируем это подробнее на примере функции, которая принимает на вход три параметра и распечатывает их значения:
const foo = (a, b, c) => {
const output = `a - ${a}; b - ${b}, c - ${c}`;
console.log(output);
};
foo('I', 'am', 'here');
// a - I; b - am, c - here
foo('I', 'am');
// a - I; b - am, c - undefined
foo('I');
// a - I; b - undefined, c - undefined
foo();
// a - undefined; b - undefined, c - undefined
Бывают ситуации, когда заранее неизвестно будет ли вообще передан в ходе выполнения кода функции аргумент или будет ли переданный аргумент содержать осмысленное значение (отличное от значения undefined
). В таких случаях удобно предусмотреть какое-нибудь дефолтное значение для параметра.
Допустим, мы хотим, чтобы при вызове функции greeting
без параметров, она выводила сообщение Hi, anonymous!
.
Тогда мы можем реализовать ее следующим образом:
const greeting = (name) => console.log(`Hi, ${name ? name : 'anonymous'}!`);
Однако, JavaScript поддерживает механизм значений по умолчанию, позволяющий немного упростить код:
const greeting = (name = 'anonymous') => console.log(`Hi, ${name}!`);
greeting();
// => Hi, anonymous!
Работает он следующим образом. Если параметр не передан, то подставляется значение по умолчанию (то, что справа от оператора =
). Если параметр передан, то переприсваивания не происходит. Параметр будет равен тому значению, которое было фактически передано в функцию.
const pow = (base, exp = 2) => base ** exp;
pow(5); // 25
pow(5, 2); // 25
pow(5, 1); // 5
Кроме того, в значениях по умолчанию можно использовать идентификаторы:
const f = (x = Math.PI) => {};
И даже вызовы функций:
const f = (x, y = Math.sqrt(x)) => {};
Но не стоит злоупотреблять этим способом. Значения по умолчанию не всегда подходят для полноценного программирования.
Примечание
В этом уроке мы рассмотрели случай, когда в функцию передается меньше параметров, чем она ожидает. У вас может возникнуть вопрос, что будет, если при вызове передать большее количество параметров, чем установлено в определении функции?
Ответ: ничего не произойдет, они будут просто проигнорированы.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.