Как работает функция stringJoin, которая принимает разделитель и строки и склеивает их?
Что проверяют
Это задача на аккуратность, а не на знание Array.prototype.join. Интервьюер смотрит, как вы уточняете сигнатуру, обрабатываете края и не ставите лишний разделитель. Следом часто просят решить без join и обсудить производительность.
Как отвечать
Сначала задайте вопросы: строки приходят массивом или отдельными аргументами, что делать с null и числами, что вернуть на пустом вводе. Для отдельных аргументов пригодится rest-параметр: function stringJoin(sep, ...parts).
Затем назовите поведение, которое стоит повторить за встроенным join:
- пустой список: возвращается пустая строка, а не ошибка;
- один элемент: возвращается он сам, без разделителя;
- разделитель: только между элементами, ни в начале, ни в конце;
- значения:
nullиundefinedпревращаются в пустую строку, остальное приводится черезString(); - разделитель по умолчанию: у
join()без аргумента это запятая, об этом полезно упомянуть.
Сама реализация: цикл по индексу, где разделитель добавляется перед каждым элементом, кроме первого. Либо reduce, но с начальным значением или проверкой длины: reduce без начального значения на пустом массиве бросает TypeError.
Про скорость: в V8 и других движках += на строках не копирует строку каждый раз, а строит внутреннее дерево (rope), поэтому цикл с конкатенацией не квадратичный. На больших объёмах join обычно всё равно быстрее, а в рабочем коде правильный ответ это просто parts.join(sep).
Чтобы показать уровень, добавьте типы на TypeScript: (sep: string, ...parts: Array<string | number>) => string, и пару тестов на края.
Где спотыкаются
Добавляют разделитель после каждого элемента, а потом отрезают хвост через slice(0, -sep.length). На пустом разделителе это slice(0, -0), он возвращает пустую строку, и функция молча ломается.
Бросают исключение на пустом массиве. Для склейки пустой список это нормальный ввод, ответ на него пустая строка.
Пропускают пустые значения проверкой if (!part) и заодно выкидывают 0 и пустые строки, хотя их нужно сохранить вместе с разделителями вокруг.