JavaScript


JavaScript ( / ɑː v ə ˌ ы к т ɪ р т / ), [8] , часто сокращенно JS , является языком программирования , который соответствует ECMAScript спецификации. [9] JavaScript - это высокоуровневый , часто скомпилированный «точно в срок» и многопарадигмальный . Он имеет синтаксис фигурных скобок , динамическую типизацию , объектную ориентацию на основе прототипов и функции первого класса..

Наряду с HTML и CSS , JavaScript является одной из основных технологий всемирной паутины . [10] Более 97% веб-сайтов используют его на стороне клиента для определения поведения веб-страниц [11], часто с использованием сторонних библиотек . [12] Все основные веб-браузеры имеют специальный механизм JavaScript для выполнения кода на устройстве пользователя .

Как язык с множеством парадигм, JavaScript поддерживает управляемые событиями , функциональные и императивные стили программирования . Он имеет интерфейсы прикладного программирования (API) для работы с текстом, датами, регулярными выражениями , стандартными структурами данных и объектной моделью документа (DOM).

Стандарт ECMAScript не включает какие-либо средства ввода / вывода (I / O), такие как сети , хранилище или графические средства. На практике веб-браузер или другая исполняющая система предоставляет API-интерфейсы JavaScript для ввода-вывода.

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

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

Создание в Netscape

Мозаика веб - браузер был выпущен в 1993 году первого браузера с графическим пользовательским интерфейсом , доступным для нетехнических людей, он играл важную роль в быстром росте зарождающейся World Wide Web . [13] Затем ведущие разработчики Mosaic основали корпорацию Netscape , которая в 1994 году выпустила более совершенный браузер Netscape Navigator . Navigator быстро стал самым популярным браузером. [14]

В те годы становления Интернета веб-страницы могли быть только статичными, не имея возможности динамического поведения после загрузки страницы в браузере. В быстро растущей среде веб-разработки было желание снять это ограничение, поэтому в 1995 году Netscape решила добавить язык сценариев в Navigator. Для этого они выбрали два пути: сотрудничество с Sun Microsystems для внедрения языка программирования Java , а также с привлечением Брендана Эйха для встраивания языка Scheme . [5]

Руководство Netscape вскоре решило, что для Эйха лучше всего было разработать новый язык с синтаксисом, похожим на Java, но менее похожим на Scheme или другие существующие языки сценариев. [4] [5] Хотя новый язык и его реализация интерпретатора назывались LiveScript, когда впервые были представлены как часть бета-версии Navigator в сентябре 1995 года, название было изменено на JavaScript для официального выпуска в декабре. [5] [1] [15]

Выбор имени JavaScript вызвал путаницу, подразумевая, что оно напрямую связано с Java. Поскольку в то время Java была популярным новым языком программирования, Netscape охарактеризовала это как маркетинговую уловку, направленную на то, чтобы придать своему новому языку значимость. [16]

Принятие Microsoft

Microsoft дебютировала Internet Explorer в 1995 году, что привело к войне браузеров с Netscape. На передней панели JavaScript, Microsoft обратной инженерии Навигатор интерпретатор , чтобы создать свой собственный, называемый JScript .

JScript был впервые выпущен в 1996 году вместе с первоначальной поддержкой CSS и расширений HTML . Каждая из этих реализаций заметно отличалась от своих аналогов в Navigator. [17] [18] Эти различия усложнили разработчикам задачу обеспечения хорошей работы своих веб-сайтов в обоих браузерах, что привело к широкому использованию логотипов «лучше всего просматривается в Netscape» и «лучше всего просматривается в Internet Explorer» в течение нескольких лет. [17] [19]

Расцвет JScript

В ноябре 1996 года Netscape представила в ECMA International JavaScript в качестве отправной точки для стандартной спецификации, которой могли бы соответствовать все поставщики браузеров. Это привело к официальному выпуску первой спецификации языка ECMAScript в июне 1997 года.

Процесс стандартизации продолжался несколько лет, с выпуском ECMAScript 2 в июне 1998 года и ECMAScript 3 в декабре 1999 года. Работа над ECMAScript 4 началась в 2000 году.

Тем временем Microsoft завоевывала все более доминирующее положение на рынке браузеров. К началу 2000-х годов доля рынка Internet Explorer достигла 95%. [20] Это означало, что JScript стал де-факто стандартом для клиентских сценариев в Интернете.

Первоначально Microsoft участвовала в процессе стандартизации и реализовала некоторые предложения на своем языке JScript, но в конечном итоге прекратила сотрудничество в области ECMA. Таким образом, ECMAScript 4 был законсервирован.

Рост и стандартизация

В период доминирования Internet Explorer в начале 2000-х клиентские сценарии находились в застое. Ситуация начала меняться в 2004 году, когда преемница Netscape, Mozilla , выпустила браузер Firefox . Firefox был хорошо принят многими, заняв значительную долю рынка у Internet Explorer. [21]

В 2005 году Mozilla присоединилась к ECMA International, и началась работа над стандартом ECMAScript for XML (E4X). Это привело к тому, что Mozilla работала совместно с Macromedia (позже приобретенным Adobe Systems ), которые внедряли E4X в свой язык ActionScript 3, основанный на черновике ECMAScript 4. Целью стала стандартизация ActionScript 3 как нового ECMAScript 4. С этой целью Adobe Systems выпустила реализацию Tamarin как проект с открытым исходным кодом . Однако Tamarin и ActionScript 3 слишком отличались от устоявшихся клиентских сценариев, и без сотрудничества с Microsoft ECMAScript 4 так и не реализовался.

Между тем, в сообществах разработчиков ПО с открытым исходным кодом, не связанных с работой ECMA, происходили очень важные события. В 2005 году Джесси Джеймс Гарретт выпустил технический документ, в котором он ввел термин Ajax и описал набор технологий, из которых JavaScript был основой, для создания веб-приложений, в которых данные могут загружаться в фоновом режиме, избегая необходимости полной страницы. перезагружает. Это вызвало период возрождения JavaScript, во главе которого стояли библиотеки с открытым исходным кодом и сообщества, которые формировались вокруг них. Было создано много новых библиотек, включая jQuery , Prototype , Dojo Toolkit и MooTools .

Google дебютировал со своим браузером Chrome в 2008 году с движком V8 JavaScript, который был быстрее, чем его конкуренты. [22] [23] Ключевым нововведением была JIT -компиляция [24], поэтому другим поставщикам браузеров пришлось пересмотреть свои движки для JIT. [25]

В июле 2008 года эти разрозненные партии собрались на конференцию в Осло . Это привело к окончательному соглашению в начале 2009 года, чтобы объединить всю соответствующую работу и продвинуть язык вперед. Результатом стал стандарт ECMAScript 5, выпущенный в декабре 2009 года.

Достижение зрелости

Амбициозная работа над языком продолжалась несколько лет, кульминацией которой стало создание обширной коллекции дополнений и уточнений, формализованных с публикацией ECMAScript 6 в 2015 году [26].

Черновик спецификации в настоящее время открыто поддерживается на GitHub , а редакции ECMAScript создаются с помощью регулярных ежегодных снимков. [27] Возможные изменения языка проверяются в рамках комплексного процесса предложения. [28] [29] Теперь вместо номеров редакций разработчики проверяют статус предстоящих функций индивидуально. [27]

Текущая экосистема JavaScript имеет множество библиотек и фреймворков , устоявшиеся практики программирования и более широкое использование JavaScript за пределами веб-браузеров. Кроме того, с появлением одностраничных приложений и других веб-сайтов с большим количеством JavaScript был создан ряд транспиляторов , чтобы помочь процессу разработки. [30]

«JavaScript» является торговой маркой в корпорации Oracle в Соединенных Штатах. [31] [32]

JavaScript является доминирующим языком сценариев на стороне клиента в Интернете, и 97% веб-сайтов используют его для этой цели. [11] Сценарии встраиваются в HTML- документы или включаются в них и взаимодействуют с DOM . Все основные веб-браузеры имеют встроенный движок JavaScript, который выполняет код на устройстве пользователя.

Примеры поведения по сценарию

  • Загрузка нового содержимого веб-страницы без перезагрузки страницы через Ajax или WebSocket . Например, пользователи из социальных сетей могут отправлять и получать сообщения , не покидая текущую страницу.
  • Анимации веб-страниц, такие как постепенное появление и исчезновение объектов, изменение размера и их перемещение.
  • Играем в браузерные игры .
  • Управление воспроизведением потокового мультимедиа .
  • Создание всплывающих окон .
  • Проверка входных значений веб-формы перед отправкой данных на веб-сервер .
  • Регистрация данных о поведении пользователя и их отправка на сервер. Владелец веб-сайта может использовать эти данные для аналитики , отслеживания рекламы и персонализации .

Библиотеки и фреймворки

Более 80% веб-сайтов используют стороннюю библиотеку JavaScript или веб-фреймворк для своих клиентских сценариев. [12]

jQuery на сегодняшний день является самой популярной библиотекой, которую используют более 75% веб-сайтов. [12] Facebook создал библиотеку React для своего веб-сайта, а затем выпустил ее с открытым исходным кодом ; другие сайты, включая Twitter , теперь используют его. Точно так же фреймворк Angular, созданный Google для своих веб-сайтов, включая YouTube и Gmail , теперь является проектом с открытым исходным кодом, используемым другими. [12]

Напротив, термин «Vanilla JS» был придуман для веб-сайтов, не использующих какие-либо библиотеки или фреймворки, вместо этого полностью полагаясь на стандартные функции JavaScript. [33]

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

Первоначальные попытки продвижения на стороне сервера использование JavaScript были Netscape Enterprise Server и Microsoft «s Information Services Интернет , [34] [35] , но они были небольшие ниши. [36] Использование на стороне сервера в конце концов начало расти в конце 2000-х, с созданием Node.js и других подходов . [36]

Electron , Cordova , React Native и другие фреймворки приложений использовались для создания многих приложений с поведением, реализованным на JavaScript. Другие небраузерные приложения включают поддержку Adobe Acrobat для создания сценариев PDF- документов [37] и расширения GNOME Shell, написанные на JavaScript. [38]

JavaScript недавно начал появляться в некоторых встроенных системах , обычно за счет использования Node.js. [39] [40] [41]

Следующие функции являются общими для всех соответствующих реализаций ECMAScript, если явно не указано иное.

Императивный и структурированный

JavaScript поддерживает большую часть синтаксиса структурированного программирования из C (например, ifоператоры, whileциклы, switchоператоры, do whileциклы и т. Д.). Одним исключением является обзорным : первоначально JavaScript было только функция области видимости с var; затем область видимости блока была добавлена ​​в ECMAScript 2015 с ключевыми словами letи const. Как и C, JavaScript делает различие между выражениями и операторами . Одним из синтаксических отличий от C является автоматическая вставка точки с запятой , которая позволяет опускать точки с запятой (которые завершают операторы). [42]

Слабо типизированный

JavaScript слабо типизирован , что означает, что определенные типы неявно приводятся в зависимости от используемой операции. [43]

  • Бинарный +оператор преобразует оба операнда в строку, если оба операнда не являются числами. Это потому, что оператор сложения дублирует оператор конкатенации.
  • Бинарный -оператор всегда приводит оба операнда к числу
  • Оба унарных оператора ( +, -) всегда приводят операнд к числу.

Значения преобразуются в следующие строки: [43]

  • Строки оставлены как есть
  • Числа преобразуются в их строковое представление
  • Элементы массивов приводятся к строкам, после которых они соединяются запятыми ( ,)
  • Остальные объекты преобразуются в строку, [object Object]где Object- имя конструктора объекта.

Значения преобразуются в числа путем преобразования в строки, а затем преобразования строк в числа. Эти процессы можно изменить, определив toStringи valueOfфункции в прототипе для преобразования строк и чисел соответственно.

JavaScript подвергся критике за то, как он реализует эти преобразования, поскольку сложность правил может быть ошибочно принята за несогласованность. [44] [43] Например, при добавлении числа к строке число будет преобразовано в строку перед выполнением конкатенации, но при вычитании числа из строки строка преобразуется в число перед выполнением вычитания.

Часто также упоминается, что {} + []приводит к 0(число). Это вводит в заблуждение: {}интерпретируется как пустой блок кода вместо пустого объекта, и пустой массив преобразуется в число оставшимся унарным +оператором. Если вы заключите выражение в круглые скобки, ({} + [])фигурные скобки интерпретируются как пустой объект, и результат выражения будет таким, "[object Object]"как ожидалось. [43]

Динамический

Печатать
JavaScript имеет динамическую типизацию, как и большинство других языков сценариев . Типа ассоциируется с значением , а не выражение. Например, переменная, изначально связанная с числом, может быть переназначена строке . [45] JavaScript поддерживает различные способы проверки типа объектов, включая утиную печать . [46]
Оценка времени выполнения
JavaScript включает evalфункцию, которая может выполнять операторы, представленные в виде строк, во время выполнения.

Объектная ориентация (на основе прототипов)

Прототипное наследование в JavaScript описывается Дугласом Крокфордом как:

Вы создаете объекты-прототипы, а затем ... создаете новые экземпляры. Объекты изменяемы в JavaScript, поэтому мы можем дополнять новые экземпляры, давая им новые поля и методы. Затем они могут выступать в качестве прототипов даже для более новых объектов. Нам не нужны классы, чтобы создавать множество похожих объектов… Объекты наследуются от объектов. Что может быть более объектно-ориентированным, чем это? [47]

В JavaScript объект - это ассоциативный массив , дополненный прототипом (см. Ниже); каждый ключ предоставляет имя для свойства объекта , и есть два синтаксических способа указать такое имя: точечная нотация ( obj.x = 10) и скобочная нотация ( obj['x'] = 10). Свойство может быть добавлено, восстановлено или удалено во время выполнения. Большинство свойств объекта (и любое свойство, которое принадлежит цепочке наследования прототипа объекта) можно перечислить с помощью for...inцикла.

Прототипы
JavaScript использует прототипы, тогда как многие другие объектно-ориентированные языки используют классы для наследования . [48] Можно смоделировать многие функции на основе классов с помощью прототипов в JavaScript. [49]
Функции как конструкторы объектов
Функции также являются конструкторами объектов вместе со своей типичной ролью. При добавлении к вызову функции префикса new будет создан экземпляр прототипа, наследующий свойства и методы конструктора (включая свойства Objectпрототипа). [50] ECMAScript 5 предлагает Object.createметод, позволяющий явное создание экземпляра без автоматического наследования от Objectпрототипа (более старые среды могут назначать прототип null). [51] Свойство конструктора prototypeопределяет объект, используемый для внутреннего прототипа нового объекта. Новые методы могут быть добавлены путем изменения прототипа функции, используемой в качестве конструктора. Встроенные конструкторы JavaScript, такие как Arrayили Object, также имеют прототипы, которые можно изменять. Хотя можно изменить Objectпрототип, это обычно считается плохой практикой, потому что большинство объектов в JavaScript наследуют методы и свойства от Objectпрототипа, и они могут не ожидать изменения прототипа. [52]
Функции как методы
В отличие от многих объектно-ориентированных языков, нет различия между определением функции и определением метода . Скорее, различие происходит во время вызова функции; когда функция вызывается как метод объекта, локальное ключевое слово this функции привязано к этому объекту для этого вызова.

Функциональный

Функция является первым классом ; функция считается объектом. Таким образом, функция может иметь свойства и методы, такие как .call()и .bind(). [53] вложенная функция является функцией , определенной в пределах другой функции. Он создается каждый раз при вызове внешней функции. Кроме того, каждая вложенная функция образует лексическое замыкание : лексическая область видимости внешней функции (включая любую константу, локальную переменную или значение аргумента) становится частью внутреннего состояния каждого внутреннего объекта функции, даже после завершения выполнения внешней функции. . [54] JavaScript также поддерживает анонимные функции .

Делегат

JavaScript поддерживает неявное и явное делегирование .

Функции как роли (черты и примеси)
JavaScript изначально поддерживает различные функциональные реализации шаблонов Role [55] , таких как Traits [56] [57] и Mixins . [58] Такая функция определяет дополнительное поведение по крайней мере одним методом, привязанным к thisключевому слову в ее functionтеле. Затем роль должна быть явно делегирована через callили applyна объекты, которые должны иметь дополнительное поведение, которое не передается через цепочку прототипов.
Состав и наследование объектов
В то время как явное делегирование на основе функций охватывает композицию в JavaScript, неявное делегирование уже происходит каждый раз при обходе цепочки прототипов, например, для поиска метода, который может быть связан с объектом, но не принадлежит ему напрямую. Как только метод найден, он вызывается в контексте этого объекта. Таким образом, наследование в JavaScript покрывается автоматизмом делегирования, который привязан к свойству прототипа функций конструктора.

Разнообразный

JS - это язык с нулевым индексом .

Среда выполнения
JavaScript обычно полагается на среду выполнения (например, веб-браузер ) для предоставления объектов и методов, с помощью которых сценарии могут взаимодействовать со средой (например, DOM веб-страницы ). Эти среды однопоточные . JavaScript также полагается на среду выполнения, чтобы обеспечить возможность включать / импортировать сценарии (например, элементы HTML