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

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

1. Отсутствие многопоточности

JavaScript — однопоточный язык, одновременно может выполняться только один фрагмент кода. Хотя современные браузеры и Node.js представили Web Workers и Worker Threads, разработчики теперь могут запускать код JavaScript одновременно в разных потоках.

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

И наоборот, Node.js предлагает рабочие потоки, которые предлагают аналогичные возможности параллельной обработки. Они позволяют программистам запускать код JavaScript в разных потоках, давая им возможность более эффективно использовать множество ядер ЦП.

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

2. Ограничения на большие числа.

JavaScript может обрабатывать огромные числа, и его точность представления чисел имеет несколько ограничений. IEEE 754, который устанавливает постоянную длину для представления чисел, целых и десятичных дробей, является стандартным использованием JavaScript. Обычно эта фиксированная длина составляет 64 бита, что снижает точность чисел, которые могут быть представлены.

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

Для иллюстрации ниже показано, как сгенерировать BigInt в JavaScript:

const bigNum = BigInt("1234567890123456789012345678901234567890");

Вы можете выполнять математические операции с BigInt так же, как и с обычными числами:

const bigNum1 = BigInt("1234567890123456789012345678901234567890");

const bigNum2 = BigInt("9876543210987654321098765432109876543210");

const result = bigNum1 * bigNum2;

console.log(result); // Output: 12193263113702179554494795670729605048032737609439226880154212900n

BigInt предлагает механизм для работы с произвольно большими целыми числами в JavaScript, хотя они могут обрабатываться медленнее, чем обычные числа JavaScript.

3. Отсутствие возможности чтения/записи на стороне клиента

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

Однако есть некоторые косвенные методы клиентского JavaScript для взаимодействия с файлами, в том числе:

  1. Используя элемент с атрибутом type="file", JavaScript может извлекать файлы, выбранные пользователем с помощью файлового API HTML5. Файловый API предлагает способы доступа к содержимому этих файлов и выполнения над ними действий, таких как их загрузка на сервер.
  2. Использование веб-хранилища на стороне клиента Используя API-интерфейсы веб-хранилища, такие как localStorage и sessionStorage, JavaScript может сохранять данные на компьютере пользователя. Эти API можно использовать для длительного или временного хранения данных, даже если они не разрешают прямой доступ к файлам.
  3. Использование сторонних API: Клиентский JavaScript может использовать сторонние API, которые предлагают функции хранения и доступа к файлам. Dropbox, Google Drive и Amazon S3 — вот несколько примеров.

Тем не менее, есть способы работать с файлами косвенно или через сторонние сервисы, даже несмотря на то, что клиентский JavaScript не может читать или записывать файлы непосредственно на компьютере пользователя.

4. Нет поддержки сети

Утверждение, что в JavaScript отсутствуют сетевые функции, неверно. JavaScript обладает широким спектром сетевых возможностей благодаря объекту XMLHttpRequest (XHR), который позволяет клиентскому JavaScript взаимодействовать с серверами через HTTP-запросы.

С момента появления Internet Explorer 5 каждый веб-браузер поддерживает объект XMLHttpRequest. Он предлагает механизм для запуска JavaScript на клиенте для отправки HTTP-запросов на сервер, таких как заполнение форм или получение данных с сервера.

Кроме того, Node.js предоставляет серверному JavaScript надежный набор сетевых функций, включая интегрированную поддержку настройки и обслуживания сетевых сокетов, отправки HTTP-запросов и настройки веб-серверов. Node.js включает в себя надежную экосистему модулей, которые предлагают дополнительные сетевые функции, такие как отправка электронной почты, обработка WebSocket и связь с базой данных.

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

5. Отсутствие множественного наследования

В отличие от некоторых других языков программирования, особенно C#, JavaScript не поддерживает множественное наследование в обычном смысле. Класс может наследовать от нескольких родительских классов, объединяя характеристики обоих родительских классов в один дочерний класс. Это известно как множественное наследование.

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

  1. Примеси. Без использования наследования примеси позволяют классу приобретать функциональность. Вы можете «примешивать» набор определенных атрибутов и методов к классу, используя примеси. Это позволяет классу включать многочисленные возможности примесей, достигая функциональности, сравнимой с множественным наследованием.
  2. Композиция. Композиция — это процесс создания нового класса из экземпляров существующих классов, позволяющий новому классу наследовать атрибуты и функции существующих классов. Можно добиться функциональности с помощью композиции, эквивалентной множественному наследованию.
  3. Интерфейсы. Интерфейсы определяют набор операций, которые должен поддерживать класс. Хотя интерфейсы — это не то же самое, что множественное наследование, их можно использовать для смешивания функций многих классов, предоставляя набор методов, которые необходимо реализовать.

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

Подведение итогов

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

Лучший способ повысить свою продуктивность и владение языком — это близко познакомиться с его тонкостями и особенностями.

💡 Совет: разработка JavaScript упрощается, если вы используете цепочку инструментов с открытым исходным кодом, такую ​​как Bit, With Bit,любой код JavaScript. вы пишете, могут быть разделены как служебные функции между приложениями. Таким образом, у вас будет независимое управление версиями, тесты и документация для них, что упростит вам их использование для всех ваших проектов.

Узнайте больше здесь:



Информация, представленная в этой статье, поможет вам понять JS и его ограничения.

Спасибо за чтение.

Создавайте приложения с повторно используемыми компонентами, как Lego

Инструмент с открытым исходным кодом Bit помогает более чем 250 000 разработчиков создавать приложения с компонентами.

Превратите любой пользовательский интерфейс, функцию или страницу в компонент многократного использования — и поделитесь им со своими приложениями. Легче сотрудничать и строить быстрее.

Подробнее

Разделите приложения на компоненты, чтобы упростить разработку приложений, и наслаждайтесь наилучшими возможностями для рабочих процессов, которые вы хотите:

Микро-интерфейсы

Система дизайна

Совместное использование кода и повторное использование

Монорепо

Узнать больше: