Когда мне попался этот вопрос, я заложил его в список "ответить позже", после чего долго ходил вокруг, не зная, что написать. Характеристики навроде "популярный", "массовый", "есть в любом браузере" — всё это, конечно, правда. Но они ничего не сообщают о языке как таковом. Все они говорят лишь о том, какое место этот язык занимает в текущих реалиях.
Что же касается самого языка как инструмента программиста, то тут JS едва ли может чем-то похвастаться. Всё тот же сишный синтаксис, как и у многих других. Гремучая смесь слабой и динамической типизации, что скорее минус. Невнятная прототипная модель ООП. Универсальный? Пожалуй да, запишем в плюсы. Простой для новичков? Считается, что да, но эта простота опасно обманчива (подробнее об этом я писал
тут). Стандартная библиотека довольно бедна, что приводит к необходимости подключать сторонние библиотеки даже для таких базовых вещей как работа с датой-временем или иммутабельность.
Впрочем, плюсы тоже есть:
- Встроенная однопоточная асинхронность позволяет легко организовывать неблокирующий ввод-вывод. Однопоточность в данном случае это плюс, так как избавляет от необходимости синхронизировать данные в памяти (классический источник багов).
- Объекты любой сложности можно задавать в виде литералов, это легко и удобно. Это же относится к спискам. Например, можно легко создать копию списка с добавленными элементами в одно действие через spread оператор (многоточие).
- Объекты в JS представляют из себя универсальную структуру данных, подходящую для множества разных целей. Код для трансформации таких объектов тоже можно сделать универсальным. Чем-то это похоже на таблицы в Lua.
- В отличие от того же Python, почти все примитивы в JS являются типами значений, что важно для быстродействия.
- В JS с самых ранних версий есть модные нынче фичи: замыкания, функции как объекты первого класса. При этом функция действительно в полной мере является объектом, то есть может иметь свои поля и т.д.
- JS сам по себе не склоняет к одной определённой парадигме. Преобразования данных возможны как императивно, так и декларативно (взять те же filter, map и reduce). Не нравятся как тут сделаны классы — можно сделать свои (см. OLOO). Не устраивают списки в виде ассоциативных массивов — можно сделать свои. Можно даже писать в почти ФП стиле без массивов, циклов и условий, производя композицию чистых функций и применяя их к связным спискам. Впрочем, это будет именно "почти ФП", так что тут и плюс и минус.
Подводя итог, современный JavaScript — это встраиваемый язык для программного доступа к объектам (далеко не только браузера). На нём можно делать мобильные, десктопные и серверные приложения. Для кого-то это станет сюрпризом, но JavaScript сейчас нередко используется во встраиваемых системах. Стандарты ECMAScript 2015 и 2019 годов существенно обогатили язык (основные аргументы противников JS относятся к версиям до 2015 года). Существующие реализации движков обладают сносным быстродействием, к тому же правильно написанный код на JS легко масштабируется. Язык конечно далёк от идеала, и никогда им не станет из-за жёстких требований обратной совместимости, но определённые плюсы у него есть.