Необязательные параметры в 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 — не «пустые», дефолт для них не применяется.
  • В качестве дефолта можно использовать выражения, вызовы функций и другие параметры — но только те, что инициализированы раньше.
Проверьте себя
1. Что выведет вызов sum() если объявлена функция `function sum(x = 3, y = 5)`?
A0
Bundefined
C35
D8
2. Что произойдёт, если передать undefined вместо аргумента для параметра со значением по умолчанию?
AПараметр будет равен undefined
BВозникнет ошибка
CПараметр будет равен null
DБудет использовано значение по умолчанию
3. Что выведет код? ```js function sum(x = 1, y = x, z = x + y) { console.log(x + y + z); } sum(); ```
A1
B4
C2
D3