Бесплатный курс по JavaScript. Зарегистрируйтесь для отслеживания прогресса →

JavaScript: Необязательные параметры функций

В программировании большое количество функций и методов имеют параметры, которые редко меняются. В таких случаях этим параметрам задают значения по умолчанию, которые можно поменять по необходимости. Этим немного сокращается количество одинакового кода. Пример:

// Функция возведения в степень
// Второй параметр имеет значение по умолчанию 2
const pow = (x, base = 2) => {
  return x ** base;
};
// 3 во второй степени (двойка задана по умолчанию)
pow(3); // 9
// три в третьей степени
pow(3, 3); // 27

https://replit.com/@hexlet/js-basics-define-functions-default-parameters

Значение по умолчанию выглядит как обычное присваивание в определении. Оно срабатывает только в том случае, если аргумент не передан. К этому нужно привыкнуть. Значение по умолчанию может быть даже в том случае, когда параметр один:

const print = (text = 'nothing') => console.log(text);

print(); // "nothing"
print("Hexlet"); // Hexlet

Параметров со значениями по умолчанию может быть сколько угодно:

const f = (a = 5, b = 10, c = 100) => { ... }

У значений по умолчанию есть одна особенность - они должны идти в самом конце списка параметров. Значения, передаваемые функции при вызове, всегда записываются в параметры слева направо, в том порядке, в котором они переданы. Получается, что если значения по умолчанию идут слева в списке параметров, перед обычными параметрами, то при вызове функции с какими-либо аргументами на место значений по умолчанию встанут значения аргументов. Например:

// Вызовем эту функцию со следующими аргументами: f(1, 2, 3)
const f = (a = 5, b = 10, c = 100, x) => { ... }
// параметры получат следующие значения: а = 1, b = 2, c = 3, x = undefined
// в x мы ничего не передали, и JS присвоил ему значение undefined

// Именно поэтому параметры со значением по умолчанию должны идти справа от обычных,
// иначе они либо будут перезаписаны, либо обычный параметр может остаться без значения

// Вызываем функцию, f(1, 2)
const f = (a = 5, x, b = 10, c = 100) => { ... }

// a = 1, x = 2, остальные параметры получают значения по умолчанию

// Здесь всё хорошо, никаких неожиданностей
const f = (x, a = 5, b = 10, c = 100) => { ... }

// И здесь
const f = (x, y, a = 5, b = 10, c = 100) => { ... }

Задание

Реализуйте функцию getHiddenCard(), которая принимает на вход номер кредитки (состоящий из 16 цифр) в виде строки и возвращает его скрытую версию, которая может использоваться на сайте для отображения. Если исходная карта имела номер 2034399002125581, то скрытая версия выглядит так ****5581. Другими словами, функция заменяет первые 12 символов, на звездочки. Количество звездочек регулируется вторым необязательным параметром. Значение по умолчанию — 4.

// Кредитка передается внутрь как строка
getHiddenCard('1234567812345678', 2); // **5678
getHiddenCard('1234567812345678', 3); // ***5678
getHiddenCard('1234567812345678');    // ****5678
getHiddenCard('2034399002121100', 1); // *1100

Для выполнения задания вам понадобится метод строки repeat(), который повторяет строку указанное количество раз

'+'.repeat(5); // +++++
'o'.repeat(3); // ooo
Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

Определения

  • Параметр по умолчанию — необязательный параметр функции


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе