Особенность работы join в JavaScript

При работе с массивом в JavaScript мне пришлось столкнуться с неожиданным поведением работы метода join(). Неожиданным оно является из-за того, что в книгах, которые я читал по JavaScript, не было сказано о том, как JavaScript выводит массивы. Вернее что произойдет, если попытаться вывести в цикле for разряженный массив (индексация массива не является непрерывной). И только после того когда я увидел что произойдет сам, я начал находить примечания в документациях. Все дело в том, что в JavaScript вывод массива идёт от 0 до arr.length. Т.е. нет проверки на его разреженность как например в PHP. И вот сейчас, когда мы знаем об этой особенности вывода массивов, мы можем провести тест с методом join().

В документации по языку программирования JavaScript сказано, что метод join() объединяет все элементы массива (или массивоподобного объекта) в строку:

var elements = ['Fire', 'Wind', 'Rain'];
elements.join();

Результат: Fire,Wind,Rain.

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

var elements = [];
elements[5] = 'Fire';
elements[94520] = 'Wind';
elements[10] = 'Rain';
elements.join();

Результат: ,,,,,Fire,,,Wind,,Rain.

На этот раз результат получился не совсем ожидаемым? Обидное здесь то, что таким результатом работы метода join я был немного потрясен. Я полагаю, что в работе самого метода разработчики могли бы предусмотреть наличие этих “пустышек” и осуществить обработку массива иным способом.

Возможно, вы спросите: “А в чем смысл такого извращения, когда такая ситуация у нас может иметь место?”. Чтобы ответить на этот вопрос я опишу ситуацию, с которой мне пришлось столкнуться при работе с API одного сервиса.

В массивах хранились значения “пользовательских полей” разных сущностей (к примеру, поля карточки контакта). Соответственно у каждого поля свой индекс. В моем случае индексы были семизначными. И при попытке преобразования данных массива в строку и ее дальнейшей отправке с помощью ajax в браузере начинался “апокалипсис”.