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

Значения по умолчанию (default parameters) в ES6 позволяют задавать резервные значения для параметров функции, используемые когда аргумент не передан или передан как undefined.

Зачем нужно

До ES6 приходилось писать param = param || defaultValue в теле функции, что некорректно для «ложных» значений (0, '', false). Синтаксис = в параметрах решает эту проблему элегантно и делает сигнатуру функции самодокументируемой.

Где используется

  • Опциональные параметры конфигурационных объектов
  • Параметры функций с типичными значениями (ограничения, флаги)
  • Деструктуризация с умолчаниями в параметрах
  • Создание гибких API

Примеры

Базовые значения по умолчанию

function greet(name = 'Гость', greeting = 'Привет') {
  return `${greeting}, ${name}!`;
}

greet('Иван', 'Здравствуй'); // "Здравствуй, Иван!"
greet('Мария');              // "Привет, Мария!"
greet;                     // "Привет, Гость!"
greet(undefined, 'Добрый день'); // "Добрый день, Гость!"

Умолчания активируются при undefined, но не при null

function test(x = 'default') {
  return x;
}

test(undefined); // 'default'
test(null);      // null — не заменяется умолчанием!
test(0);         // 0 — тоже не заменяется
test('');        // '' — не заменяется

Выражения как умолчания

function getTimestamp() {
  return Date.now();
}

function createEvent(name, timestamp = getTimestamp) {
  // getTimestamp вызывается при каждом отсутствующем аргументе
  return { name, timestamp };
}

// Умолчание может ссылаться на предыдущие параметры
function createRange(start = 0, end = start + 10) {
  return { start, end };
}

createRange;    // { start: 0, end: 10 }
createRange(5);   // { start: 5, end: 15 }
createRange(5, 8); // { start: 5, end: 8 }

Деструктуризация с умолчаниями

// Параметр — объект с умолчаниями по умолчанию
function connect({ host = 'localhost', port = 3000, timeout = 5000 } = {}) {
  return `${host}:${port} (${timeout}ms)`;
}

connect;                          // 'localhost:3000 (5000ms)'
connect({ port: 8080 });            // 'localhost:8080 (5000ms)'
connect({ host: 'db', port: 5432 }); // 'db:5432 (5000ms)'

Умолчания для массива

function createMatrix(rows = 3, cols = rows, fill = 0) {
  return Array.from({ length: rows }, () =>     Array.from({ length: cols }, () => fill)
  );
}

createMatrix;      // 3x3 матрица из нулей
createMatrix(2);     // 2x2 матрица
createMatrix(2, 4, 1); // 2x4 матрица из единиц

Сравнение со старым подходом

// Старый способ (небезопасен для 0, '', false)
function oldGreet(name, greeting) {
  name = name || 'Гость';       // НЕПРАВИЛЬНО: greet('') → 'Гость'
  greeting = greeting || 'Привет';
  return `${greeting}, ${name}!`;
}

// Безопасный старый способ
function saferGreet(name, greeting) {
  name = name !== undefined ? name : 'Гость';
  greeting = greeting !== undefined ? greeting : 'Привет';
  return `${greeting}, ${name}!`;
}

// Современный способ (лучше всего)
function modernGreet(name = 'Гость', greeting = 'Привет') {
  return `${greeting}, ${name}!`;
}

Частые ошибки

  • null не активирует умолчание — только undefined заменяется умолчанием; null считается явно переданным значением.
  • Умолчание ссылается на параметр, объявленный позжеfunction f(a = b, b = 1) — ошибка; умолчание может ссылаться только на предыдущие параметры.
  • Нет умолчания {} = {} — без = {} вызов функции без аргумента с деструктуризацией вызовет TypeError.

Связанные темы

Ресурсы