Параметры по умолчанию
У кофемашины есть кнопки размера чашки. Если вы ничего не выбрали, машина не стоит в ожидании, а наливает среднюю чашку — так она настроена заранее. Функциям тоже бывает нужна такая заводская настройка.
Если функцию вызвать без аргумента, параметр получает undefined. Так бывает, когда аргумент забыли передать или он не нужен в большинстве вызовов. Давайте посмотрим, что выйдет, если сложить строку с undefined:
function greet(name) {
return "Hello, " + name;
}
console.log(greet("Ann")); // Hello, Ann
console.log(greet()); // Hello, undefinedРазберём по строкам:
greet("Ann")кладёт"Ann"вnameи возвращаетHello, Ann.greet()вызывает функцию без аргумента, иnameполучаетundefined.- Строка складывается с
undefined, и в результате появляется словоundefined:Hello, undefined.
Пользователю такое приветствие показывать нельзя. Нужно запасное значение на случай, когда аргумента нет.
Значение по умолчанию
Запасное значение можно задать проверкой внутри функции: if (name === undefined) { name = "guest"; }. Короче — поставить = и значение сразу после имени параметра. Такой параметр называют параметром по умолчанию: он получает это значение, когда аргумента нет.
function welcome(name = "guest") {
return "Hello, " + name;
}
console.log(welcome()); // Hello, guest
console.log(welcome(undefined)); // Hello, guest
console.log(welcome("Ann")); // Hello, AnnДавайте разберём три вызова:
welcome()— аргумента нет, иnameполучает"guest".welcome(undefined)— явно переданныйundefinedдействует так же, как пропущенный аргумент.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: ноль — допустимое количество, и функция его сохраняет.
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 тоже заменится значением по умолчанию:
console.log(welcome(null)); // ✗Программа напечатает Hello, null: null — настоящий аргумент, и умолчание не срабатывает. Значение null передают, когда хотят явно сказать «значения нет», и функция получает его как есть.
Если null тоже нужно заменять, уберите умолчание и примените ?? внутри функции: return "Hello, " + (name ?? "guest");. Тогда и null, и undefined заменятся строкой "guest".
Главное
- Параметр по умолчанию записывают как
name = "guest"в списке параметров. - Умолчание срабатывает, только когда аргумент равен
undefined: пропущен или передан явно. 0,"",nullиfalseсохраняются как есть, в отличие от замены через||.- Чтобы пропустить параметр в середине, на его место передают
undefined.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.