Как задать значение параметра функции по умолчанию в JavaScript?
Использование параметров по умолчанию в ES6
Да, в современном JavaScript (ES6 и новее) есть встроенный синтаксис для задания значений параметров по умолчанию. Он работает точно так же, как в Python или других языках. Вы можете указать значение прямо в объявлении функции после знака равенства.
Вот как можно исправить ваш пример:
function greet(name = "Гость") {
console.log(`Привет, ${name}!`);
}
greet("Анна"); // "Привет, Анна!"
greet(); // "Привет, Гость!"
greet(undefined); // "Привет, Гость!"
Как это работает
Параметр по умолчанию срабатывает только если переданный аргумент равен undefined. Это важный нюанс:
- Если аргумент не передан — значение параметра становится
undefined, и срабатывает значение по умолчанию. - Если передан
undefinedявно — тоже срабатывает значение по умолчанию. - Если передан
null, пустая строка, 0 или false — значение по умолчанию НЕ сработает, так как эти значения не равныundefined.
Пример с разными типами:
function test(value = "по умолчанию") {
console.log(value);
}
test(null); // null (не сработало)
test(""); // "" (не сработало)
test(0); // 0 (не сработало)
test(false); // false (не сработало)
test(undefined); // "по умолчанию" (сработало)
test(); // "по умолчанию" (сработало)
Несколько параметров с разными комбинациями
Вы можете смешивать параметры с умолчанием и без. Главное — параметры без умолчания должны идти первыми:
function createUser(name, age = 18, city = "Неизвестно") {
console.log(`Имя: ${name}, Возраст: ${age}, Город: ${city}`);
}
createUser("Иван"); // Имя: Иван, Возраст: 18, Город: Неизвестно
createUser("Мария", 25); // Имя: Мария, Возраст: 25, Город: Неизвестно
createUser("Петр", 30, "Москва"); // Имя: Петр, Возраст: 30, Город: Москва
Обратите внимание: параметр name обязателен. Если его не передать, он будет undefined, и это может вызвать ошибку в коде.
Значения по умолчанию могут быть выражениями
Вы можете использовать не только простые значения, но и вызовы функций или сложные выражения. Важно: выражение вычисляется только в момент вызова функции, и только если параметр действительно равен undefined:
function getTimestamp() {
return Date.now();
}
function logEvent(message, timestamp = getTimestamp()) {
console.log(`[${timestamp}] ${message}`);
}
logEvent("Событие произошло"); // timestamp будет вычислен при вызове
Использование предыдущих параметров
Значение по умолчанию может ссылаться на предыдущие параметры той же функции:
function multiply(a, b = a * 2) {
return a * b;
}
console.log(multiply(5)); // 5 * 10 = 50
console.log(multiply(5, 3)); // 5 * 3 = 15 (значение по умолчанию не используется)
Совет для новичков
Если вам нужно различать null и undefined, используйте проверку внутри функции:
function greet(name) {
if (name == null) { // проверка и на null, и на undefined
name = "Гость";
}
console.log(`Привет, ${name}!`);
}
Но в большинстве случаев современный синтаксис с = — это самый чистый и читаемый способ задать значения по умолчанию.
Альтернативный подход: логическое ИЛИ (||)
До появления ES6 разработчики часто использовали оператор логического ИЛИ для задания значений по умолчанию:
function greet(name) {
name = name || "Гость";
console.log("Привет, " + name + "!");
}
Этот подход работает, но есть важное отличие: он срабатывает для любого "ложного" значения (falsy): null, undefined, 0, "", false, NaN. Поэтому если вы передадите пустую строку или число 0, они будут заменены на значение по умолчанию, что не всегда желательно.
Пример проблемы:
function setCount(count) {
count = count || 10;
console.log(count);
}
setCount(0); // 10 (а ожидалось 0!)
setCount(""); // 10 (а ожидалась пустая строка)
Если вы уверены, что валидные аргументы всегда "истинные" (truthy), этот метод подойдет. Но для более точного контроля используйте синтаксис ES6 с = или проверку === undefined.
Еще один старый способ — проверка через typeof:
function greet(name) {
if (typeof name === 'undefined') {
name = "Гость";
}
console.log("Привет, " + name + "!");
}
Этот метод безопаснее, чем ||, но громоздче, чем современный синтаксис.