Реализовать функцию, принимающую аргументы "*", "1", "b", "1c" и возвращающую строку "1*b*1c"
Необходимо реализовать функцию, принимающую аргументы "*", "1", "b", "1c" и возвращающую строку "1*b*1c"
Примеры:
func("*", "1", "b", "1c") === "1*b*1c",
func("*", "13", "sb", "1bc") === "13*sb*1bc",
func("*", "13", "sb", "1bc", "32tg") === "13*sb*1bc*32tg",
func("*", "13", "sb", "1bc", "32tg", "3gg5") === "13*sb*1bc*32tg*3gg5"
Теория по задаче
Что требуется по смыслу
Требуется вариативная функция: количество аргументов заранее неизвестно, но первый аргумент всегда особый (разделитель), а остальные — элементы, которые необходимо объединить.
Последовательность действий:
- Принять
separator. - Собрать остальные аргументы в список (массив).
- Вернуть строку, полученную соединением элементов списка через
separator.
Остаточные параметры (rest parameters)
Остаточные параметры записываются как ...parts в конце списка параметров функции и собирают все “лишние” аргументы в массив.
Пример сопоставления при вызове:
- Вызов:
func("*", "13", "sb", "1bc") - Внутри:
separatorстановится"*"partsстановится["13", "sb", "1bc"]
Преимущество: parts — это уже Array, поэтому можно сразу вызывать методы массива.
Метод Array.prototype.join()
Метод join(separator) возвращает новую строку, соединяя элементы массива и вставляя разделитель между соседними элементами.
Базовое правило:
["a", "b", "c"].join("*")даёт"a*b*c".
Важные “краевые” случаи:
- Если массив пустой, результат — пустая строка
"". - Если элемент массива равен
nullилиundefined, он превращается в пустую строку при соединении. - Остальные типы обычно приводятся к строке (например, число 10 станет
"10").
Почему первый аргумент не должен попасть в склейку
Разделитель — это “правило склейки”, а не “часть данных”, поэтому он отделяется от остального.
Наглядный поток данных:
Входные аргументы: ("*", "1", "b", "1c")
│
├─ separator = "*"
│
└─ parts = ["1", "b", "1c"]
│
└─ parts.join("*") = "1*b*1c"
Если по ошибке склеивать все аргументы как данные, получится лишний символ разделителя в начале результата.
Rest parameters и arguments: что выбрать
В современных проектах чаще применяется ...parts, потому что это проще и безопаснее для начинающего разработчика (меньше преобразований, меньше “скрытых” особенностей).
| Критерий | rest parameters (...parts) | arguments |
|---|---|---|
| Что получается внутри функции | Настоящий массив (Array) | Массивоподобный объект |
| Нужно ли преобразование в массив | Нет | Да, если нужны методы массива |
| Что включает | Только аргументы после именованных параметров | Все аргументы функции |
| Читаемость | Обычно выше | Обычно ниже (требуются дополнительные действия) |
Кратко: для решения требуется принять разделитель первым параметром, собрать все остальные аргументы в массив (через ...parts или через преобразование arguments), затем вернуть результат join(); рекомендуемая форма: function func(sep, ...parts) { return parts.join(sep) }.