Перейти к содержимому
Теория · Функции · урок 4 из 10

Параметры по умолчанию

У кофемашины есть кнопки размера чашки. Если вы ничего не выбрали, машина не стоит в ожидании, а наливает среднюю чашку — так она настроена заранее. Функциям тоже бывает нужна такая заводская настройка.

Если функцию вызвать без аргумента, параметр получает undefined. Так бывает, когда аргумент забыли передать или он не нужен в большинстве вызовов. Давайте посмотрим, что выйдет, если сложить строку с undefined:

JavaScript
function greet(name) {
    return "Hello, " + name;
}

console.log(greet("Ann")); // Hello, Ann
console.log(greet()); // Hello, undefined

Разберём по строкам:

  1. greet("Ann") кладёт "Ann" в name и возвращает Hello, Ann.
  2. greet() вызывает функцию без аргумента, и name получает undefined.
  3. Строка складывается с undefined, и в результате появляется слово undefined: Hello, undefined.

Пользователю такое приветствие показывать нельзя. Нужно запасное значение на случай, когда аргумента нет.

Значение по умолчанию

Запасное значение можно задать проверкой внутри функции: if (name === undefined) { name = "guest"; }. Короче — поставить = и значение сразу после имени параметра. Такой параметр называют параметром по умолчанию: он получает это значение, когда аргумента нет.

JavaScript
function welcome(name = "guest") {
    return "Hello, " + name;
}

console.log(welcome()); // Hello, guest
console.log(welcome(undefined)); // Hello, guest
console.log(welcome("Ann")); // Hello, Ann

Давайте разберём три вызова:

  1. welcome() — аргумента нет, и name получает "guest".
  2. welcome(undefined) — явно переданный undefined действует так же, как пропущенный аргумент.
  3. welcome("Ann") — аргумент есть, и умолчание не нужно.

Умолчание видно в первой строке функции, поэтому сразу понятно, какой аргумент можно не передавать. Это как надпись на кнопке кофемашины: «по умолчанию — средняя чашка».

Здесь аналогия заканчивается: у кофемашины нет кнопки «ничего не выбрано», а функции можно явно передать undefined. Такой аргумент тоже включает умолчание.

Умолчание из другого параметра

Значение по умолчанию вычисляется при каждом вызове, которому оно нужно, а не один раз заранее. Поэтому в нём можно использовать параметр, стоящий раньше: в function area(width, height = width) при вызове area(3) параметр height получает 3. При вызове area(5) он получит уже 5.

Порядок параметров

Параметры с умолчанием обычно ставят последними, чтобы их можно было пропустить в конце вызова. Аргументы заполняют параметры слева направо, поэтому без аргумента остаются только последние параметры.

Если нужно пропустить параметр в середине, на его место передают undefined. Для function box(width = 1, height = 1) при вызове box(undefined, 5) параметр width получает 1, а height — 5.

Только для undefined

Умолчание срабатывает, только когда аргумент равен undefined. Любое другое значение сохраняется таким, каким его передали, даже ложное: 0, "", null или false. Поэтому limit(0) возвращает 0: ноль — допустимое количество, и функция его сохраняет.

JavaScript
function limit(count = 10) {
    return count;
}

console.log(limit(), limit(0), limit(null), limit(false)); // 10 0 null false

Этот вопрос часто задают на собеседовании: «Чем параметр по умолчанию отличается от || и ???» Каждый из трёх способов заменяет свой набор значений:

  • оператор || заменяет любое ложное значение, поэтому 0 || 10 даёт 10;
  • оператор ?? заменяет null и undefined;
  • параметр по умолчанию реагирует на одно значение: undefined.

Частая ошибка

Ждут, что null тоже заменится значением по умолчанию:

JavaScript
console.log(welcome(null)); // ✗

Программа напечатает Hello, null: null — настоящий аргумент, и умолчание не срабатывает. Значение null передают, когда хотят явно сказать «значения нет», и функция получает его как есть.

Если null тоже нужно заменять, уберите умолчание и примените ?? внутри функции: return "Hello, " + (name ?? "guest");. Тогда и null, и undefined заменятся строкой "guest".

Главное

  • Параметр по умолчанию записывают как name = "guest" в списке параметров.
  • Умолчание срабатывает, только когда аргумент равен undefined: пропущен или передан явно.
  • 0, "", null и false сохраняются как есть, в отличие от замены через ||.
  • Чтобы пропустить параметр в середине, на его место передают undefined.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом