December 13, 2021

Почему не следует винить JavaScript

JavaScript - один из самых популярных и самых ненавистных языков программирования. Большинство программистов в мире ежедневно пишут код на JavaScript - для создания веб-приложений корпоративного уровня, настольных, мобильных, CLI, IoT и smart-TV приложений. На GitHub хранится больше всего исходников именно на JavaScript, если сравнивать с другими языками программирования. Многие фреймворки/платформы на JavaScript все больше и больше повышают свою производительность с помощью таких технологий, как компиляция "точно в срок" (JIT-Just in time) и опережающая компиляция (AOT - Аhead of time compilation). JavaScript становится все более популярным с каждой секундой.

С другой стороны, существует много критики в адрес JavaScript, но это касается многих языков, C++ также многие недовольны. JavaScript не предлагает собственного целочисленного типа, но предоставляет общий тип с плавающей точкой для хранения всех чисел. Приведение типов создает скрытые проблемы в исходных кодах. Кроме того, глобальные переменные, логика областей видимости и слабо типизированный стиль, основанный на прототипах, немного сбивают с толку. В JavaScript есть много странных и запутанных моделей поведения. Да, в JavaScript есть плохие стороны.

В этой статье я объясню, почему не стоит критиковать JavaScript за его плохие стороны. Также я объясню, что можно сделать для решения распространенных проблем в JavaScript.

Почему у JavaScript (все еще) есть плохие стороны?

JavaScript начал свой путь как простой язык скриптов, позволяющий сделать статичные веб-страницы интерактивными со стороны клиента (из браузера). Веб-браузеры встраивали интерпретаторы JavaScript и позволяли пользователям выполнять код JavaScript на своих компьютерах. Веб-браузеры имели различные интерпретаторы JavaScript. Поэтому ECMAScript создал спецификацию для JavaScript, чтобы позволить веб-разработчикам писать кроссбраузерные сценарии. Позже Node.js помог JavaScript перейти из "песочницы" браузера на уровень операционной системы.

Несмотря на то, что сегодня программисты используют JavaScript повсеместно - его основной целью было безопасное выполнение простых скриптов со стороны клиента. Скрипты на стороне клиента не должны нарушать функциональность всего сайта. Слабо типизированное поведение и приведение типов позволяют выполнять код JavaScript без остановки конкретного скрипта при возникновении ошибок.

Ранее JavaScript помогал программистам делать веб-страницы интерактивными. Скрипты на стороне клиента не содержали бизнес-логики - веб-разработчики реализовывали бизнес-логику на веб-серверах. Позже программисты стали писать все на JavaScript. В результате многие программисты начали сравнивать простой язык скриптов с полнофункциональными, зрелыми языками программирования.

Новые версии ECMAScript начали выпускать некоторые обновления для замены плохих деталей JavaScript из-за неожиданной популярности языка. Но ECMAScript не мог отказаться от плохих сторон, поскольку это могло привести к поломке половины веб-страниц в Интернете.

Улучшайте свой код - вместо того, чтобы критиковать язык

ECMAScript вводит новые возможности для модернизации JavaScript и делает JavaScript конкурентоспособным с другими современными языками. С другой стороны, разработчики веб-браузеров делают свои веб-интерфейсы согласованными, чтобы облегчить жизнь веб-разработчикам. К сожалению, большинство программистов критикуют JavaScript, жалуясь на некоторые функции, реализованные десятилетия назад. Удаление функций, несомненно, сложнее, чем их внедрение в каждой популярной платформе. В JavaScript удаление основных функций практически невозможно - потому что людям все еще нужно видеть старые веб-страницы в новых браузерах. Разработчики не собираются переписывать все кодовые базы JavaScript, добавляя в них новые возможности.

Вместо того чтобы критиковать проблемы JavaScript, используйте новые решения с чистым кодом. Внутренняя система счисления JavaScript, несомненно, плоха, поскольку даже целое значение хранится в виде числа с плавающей точкой.

console.log(9999999999999999) // 10000000000000000

Приведенный выше пример выглядит не совсем правильно, верно? Вместо этого можно использовать встроенный класс BigInt.

console.log(9999999999999999n) // 9999999999999999n (Note "n")

Если вам нужно представление денежных значений на основе JavaScript, рассмотрите возможность использования Dinero.js, который предлагает специфические для денежных значений функции, в отличие от родного BigInt.

Вот еще один. Применяемое в JavaScript согласование типов иногда сбивает с толку, как показано ниже.

console.log(true + true) // 2 .. но зачем?

Несмотря на то, что приведенная выше ситуация не имеет практических случаев использования, выглядит она плохо, не так ли? Попробуйте TypeScript для использования JavaScript в качестве (ненастоящего) статически типизированного языка - как решение.

console.log(true + true) // Оператор '+' не может быть применен...

Кроме того, существует известная ошибка в typeof null. Современные движки JavaScript были вынуждены реализовать эту ошибку как особенность для сохранения обратной совместимости.

MDN объясняет, почему тип null является объектом.

В результате, теперь вы должны проверять и null, если вам нужно проверить, содержит ли определенная переменная ссылку на объект.

let isObject = typeof objRef == "object" && ObjRef != null

Язык программирования C++ также подвергается критике, как и JavaScript, из-за своей сложной спецификации и стандартной библиотеки. Но почему бы вам не использовать только те функции, которые вам нужны? C++ - хороший язык для написания легких, высокопроизводительных программных систем на уровне операционной системы. И C++, и JavaScript - более старые и популярные языки, чем современные, минимальные, менее критикуемые языки, такие как Go.

JavaScript - это язык программирования для начинающих, как и Python. Изучение JavaScript имеет массу преимуществ: создание не только веб-приложений, но и чего угодно. Изучайте новые положительные стороны JavaScript, а не обвиняйте функции, реализованные десятилетия назад.

JavaScript бессмертен - и альтернатив нет!

WebAssembly не является заменой JavaScript - это кросс-браузерный формат байт-кода для выполнения процессороемких вычислений, которые JavaScript не может эффективно обрабатывать в браузере. Веб-разработчики никогда не будут использовать C++ или Rust для написания фронтенда веб-приложений - но они могут использовать WebAssembly для снижения нагрузки на сервер, передавая некоторые задачи по обработке данных на компьютер пользователя. Например, WebAssembly - хороший выбор для написания веб-приложений для редактирования видео или работы с изображениями на стороне клиента.

Раньше каждый программист писал нативные настольные приложения из-за ограниченных аппаратных ресурсов компьютера пользователя. Но сейчас даже крупные технологические компании создают настольные приложения на JavaScript из-за скорости разработки и предоставления функций. Просто сравните время разработки для создания подсветки синтаксиса на C/C++ и JavaScript.

Мы живем в эпоху смешения Web 3.0 и Web 4.0. Веб-браузер становится бесполезным, если отключить функцию выполнения кода JavaScript. Кроме того, большинство программистов склонны использовать JavaScript для написания веб-бэкендов благодаря богатой экосистеме библиотек. Такие фреймворки, как React Native, сделали JavaScript более популярным в сообществе мобильных разработчиков.

JavaScript стал универсальным языком благодаря V8, Node.js и Hermes. Более того, в браузере нельзя запустить никакой другой язык, кроме JavaScript.

Заключение

Программисты используют различные языки программирования для создания программных систем. Мы выбираем языки программирования в зависимости от наших предпочтений, поддержки сообщества, встроенных функций, поддержки сторонних библиотек и производительности. Идеальных языков программирования не существует - каждый язык имеет свои плюсы и минусы. Современная версия JavaScript (ES6 или более поздние версии) является хорошим языком программирования для создания приложений.

JavaScript все еще имеет некоторые плохие стороны, потому что ECMAScript не может удалить особенности языка из-за проблем обратной совместимости. Но, как решение, вы можете скрыть его плохие стороны более новыми хорошими сторонами, не критикуя весь язык. Также не стоит винить JavaScript в проблемах совместимости браузеров, несоответствии API браузеров, проблемах безопасности NPM, раздутых пакетах приложений Electron или медленных мобильных приложениях React Native - эти компоненты вообще не относятся к ECMAScript.

Источник: https://levelup.gitconnected.com/why-you-shouldnt-blame-javascript-f6b3a81fc5f0