Реализовать функцию, принимающую аргументы "*", "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"

Теория по задаче

Что требуется по смыслу

Требуется вариативная функция: количество аргументов заранее неизвестно, но первый аргумент всегда особый (разделитель), а остальные — элементы, которые необходимо объединить.

Последовательность действий:

  1. Принять separator.
  2. Собрать остальные аргументы в список (массив).
  3. Вернуть строку, полученную соединением элементов списка через 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) }.