Необязательные параметры в JS
Параметры по умолчанию в JS (ES6+): как задать запасное значение аргумента функции, выражения и другие параметры в качестве дефолта, поведение undefined.
Параметр по умолчанию — значение, которое функция использует для аргумента, если вызывающая сторона не передала его или передала
undefined.
Синтаксис
function имя(параметр = значение_по_умолчанию) { ... }
До ES6 дефолтные значения проверяли вручную через if. Теперь это часть синтаксиса.
Базовый пример
function greet(name = "гость") {
console.log(`Привет, ${name}!`);
}
greet("Маша"); // аргумент передан — дефолт не используется
greet(); // аргумент не передан — берётся "гость"
Вывод:
Привет, Маша! Привет, гость!
Несколько параметров с дефолтом
function power(base = 2, exp = 3) {
return base ** exp;
}
console.log(power(5, 2)); // 25 — оба аргумента переданы
console.log(power(5)); // 125 — exp = 3 по умолчанию
console.log(power()); // 8 — base = 2, exp = 3
Вывод:
25 125 8
Параметры с дефолтом принято ставить в конец списка аргументов. Если обязательный параметр идёт после необязательного, вы вынуждены явно передавать
undefined, чтобы «пропустить» его.
Выражения как значение по умолчанию
Значение по умолчанию — это не просто константа: им может быть любое выражение JavaScript, в том числе вызов функции или другой параметр.
Пример 1. Другой параметр в качестве дефолта
function box(width = 10, height = width) {
console.log(`Ширина: ${width}, Высота: ${height}`);
}
box(20); // height возьмёт значение width = 20
box(20, 5); // оба аргумента переданы явно
Вывод:
Ширина: 20, Высота: 20 Ширина: 20, Высота: 5
Пример 2. Функция как дефолт
function getDefaultTax() {
return 0.2; // 20%
}
function price(amount, tax = getDefaultTax()) {
return amount * (1 + tax);
}
console.log(price(1000)); // 1000 * 1.2 = 1200
console.log(price(1000, 0.1)); // 1000 * 1.1 = 1100
Вывод:
1200 1100
Поведение undefined
Если передать undefined, функция ведёт себя так, будто аргумент вообще не передавался — берётся дефолт. Значение null при этом не считается «пустым» — оно передаётся как есть.
function show(x = 99) {
console.log(x);
}
show(undefined); // 99 — дефолт активируется
show(null); // null — передаётся как есть
show(0); // 0 — явное значение, дефолт не нужен
Вывод:
99 null 0
Ошибка: дефолт ссылается на ещё не инициализированный параметр
function broken(x = y, y = 1) {
return x + y;
}
broken(); // ReferenceError: Cannot access 'y' before initialization
Параметры инициализируются слева направо. x хочет взять y, но y ещё не существует — отсюда ошибка.
Коротко
- Параметр по умолчанию записывается как
param = значениепрямо в сигнатуре функции. - Дефолт используется, если аргумент не передан или передан
undefined. nullи0— не «пустые», дефолт для них не применяется.- В качестве дефолта можно использовать выражения, вызовы функций и другие параметры — но только те, что инициализированы раньше.