Avatar ·

Как задать значение параметра функции по умолчанию в JavaScript?

Всем привет! Я только начинаю изучать JavaScript и столкнулся с проблемой. Пишу функцию, которая приветствует пользователя. Хочу, чтобы если имя не передано, то использовалось значение по умолчанию — например, "Гость". Но у меня не получается сделать это красиво. Вот мой код: ```javascript function greet(name) { console.log("Привет, " + name + "!"); } ``` Я пробовал проверять внутри функции: `if (name === undefined) { name = "Гость"; }`. Это работает, но выглядит громоздко, особенно если параметров много. На других языках (например, Python) можно просто написать `def greet(name="Гость"):`. Есть ли в JavaScript аналогичный синтаксис? Также интересует, что будет, если передать `null` или пустую строку. Считается ли это "отсутствием значения"? И как быть с несколькими параметрами, где некоторые имеют значения по умолчанию, а другие — нет? Буду благодарен за подробное объяснение с примерами. P.S. Использую современный JavaScript (ES6+), если это важно. <<>>

Использование параметров по умолчанию в 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 + "!");
}

Этот метод безопаснее, чем ||, но громоздче, чем современный синтаксис.