Значения по умолчанию
Значения по умолчанию (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.