Страница защищена ожидающими изменениями
Послушайте эту статью
Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Наряду с HTML и CSS , JavaScript является одной из основных технологий всемирной паутины . [10] JavaScript позволяет создавать интерактивные веб-страницы и является неотъемлемой частью веб-приложений . Подавляющее большинство веб-сайтов используют его для поведения страницы на стороне клиента [11], и все основные веб-браузеры имеют специальный механизм JavaScript для его выполнения.

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

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

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

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

История [ править ]

Создание в Netscape [ править ]

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

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

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

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

Принятие Microsoft [ править ]

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

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

Расцвет JScript [ править ]

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

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

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

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

Рост и стандартизация [ править ]

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

В 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, который был быстрее, чем его конкуренты. [21] [22] Ключевым нововведением была своевременная компиляция (JIT), [23] поэтому другим поставщикам браузеров пришлось пересмотреть свои механизмы для JIT. [24]

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

Достижение зрелости [ править ]

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

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

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

Торговая марка [ править ]

«JavaScript» является торговой маркой в корпорации Oracle в Соединенных Штатах. [30] Он используется по лицензии для технологии, изобретенной и внедренной Netscape Communications и другими сторонами. [31]

Использование веб-сайта на стороне клиента [ править ]

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

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

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

Библиотеки и фреймворки [ править ]

Большинство веб-сайтов используют стороннюю библиотеку JavaScript или фреймворк веб-приложений как часть сценариев клиентских страниц. [32]

jQuery - самая популярная библиотека, которую используют более 70% веб-сайтов. [32]

Угловая структура была создана Google для своих веб - сервисов; теперь он имеет открытый исходный код и используется другими веб-сайтами. Точно так же Facebook создал фреймворк React для своего веб-сайта, а затем выпустил его с открытым исходным кодом; другие сайты, включая Twitter , теперь используют его. Есть и другие структуры с открытым исходным кодом в использовании, такие как Backbone.js и Vue.js . [32]

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

Другое использование[ редактировать ]

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

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

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

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

React Native позволяет создавать собственные мобильные приложения для Android и iOS , использующие версию платформы React, аналогичную веб-сайтам.

Особенности [ править ]

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

Императивная и структурированная [ править ]

JavaScript поддерживает большую часть синтаксиса структурированного программирования из C (например, ifоператоры, whileциклы, switchоператоры, do whileциклы и т. Д.). Одно частичное исключение обзорное : JavaScript изначально была только функция области видимости с var. В ECMAScript 2015 добавлены ключевые слова letи constдля области видимости блока, что означает, что в JavaScript теперь есть и функция, и область видимости блока. Как и 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 <script> ). Это не языковая функция как таковая, но она распространена в большинстве реализаций JavaScript. JavaScript обрабатывает сообщения из очереди по одному. JavaScript вызывает функцию, связанную с каждым новым сообщением, создавая фрейм стека вызовов с аргументами функции.и локальные переменные . Стек вызовов сжимается и увеличивается в зависимости от потребностей функции. Когда стек вызовов пуст после завершения функции, JavaScript переходит к следующему сообщению в очереди. Это называется циклом событий , описываемым как «выполнение до завершения», потому что каждое сообщение полностью обрабатывается до того, как будет рассмотрено следующее сообщение. Однако языковая модель параллелизма описывает цикл событий как неблокирующий : ввод / вывод программы выполняется с использованием событий и функций обратного вызова . Это означает, например, что JavaScript может обрабатывать щелчок мышью, ожидая, пока запрос к базе данных вернет информацию. [59]
Вариативные функции
В функцию можно передать неопределенное количество параметров. Функция может получить к ним доступ через формальные параметры, а также через локальный argumentsобъект. Функции с переменным числом аргументов также можно создавать с помощью bindметода.
Литералы массивов и объектов
Как и многие языки сценариев, массивы и объекты ( ассоциативные массивы на других языках) могут быть созданы с помощью краткого синтаксиса сокращений. Фактически, эти литералы составляют основу формата данных JSON .
Обычные выражения
JavaScript также поддерживает регулярные выражения аналогично Perl , которые обеспечивают сжатый и мощный синтаксис для обработки текста, более сложный, чем встроенные строковые функции. [60]
Обещания
JavaScript также поддерживает обещания, которые представляют собой способ обработки асинхронных операций. Существует встроенный объект Promise, который предоставляет доступ ко многим функциям для обработки обещаний и определяет, как они должны обрабатываться. Это позволяет связать обработчики с конечным значением успеха или причиной сбоя асинхронного действия. Это позволяет асинхронным методам возвращать значения, как синхронные методы: вместо того, чтобы немедленно возвращать окончательное значение, асинхронный метод возвращает обещание предоставить значение в какой-то момент в будущем. Недавно в спецификацию JavaScript были введены методы комбинатора, которые позволяют разработчикам комбинировать несколько обещаний JavaScript и выполнять операции на основе различных сценариев. Представлены следующие методы: Promise.race, Promise.all, Promise.allSettled и Promise.any.

Расширения для конкретных поставщиков [ править ]

Исторически некоторые движки JavaScript поддерживали эти нестандартные функции:

  • условные catchпредложения (например, Java)
  • понимание массивов и выражения генератора (например, Python)
  • краткие функциональные выражения ( function(args) expr; этот экспериментальный синтаксис предшествовал стрелочным функциям)
  • ECMAScript for XML (E4X), расширение, которое добавляет встроенную поддержку XML в ECMAScript (не поддерживается в Firefox с версии 21 [61] )

Синтаксис [ править ]

Простые примеры [ править ]

Переменные в JavaScript могут быть определены с помощью ключевых слов var, [62] let[63] или const[64] .

// Объявляет переменную в области функции с именем `x` и неявно присваивает ей // специальное значение` undefined`. Переменные без значения // автоматически устанавливаются в неопределенное значение. var  x ;// Переменные можно вручную установить на `undefined`, например так var  x2  =  undefined ;// Объявляет переменную с блочной областью видимости с именем `y` и неявно устанавливает для нее // значение` undefined`. Ключевое слово let было введено в ECMAScript 2015. let  y ;// Объявляет не переназначаемую переменную с блочной областью видимости с именем `z` и устанавливает для нее // строковый литерал. Ключевое слово `const` также было введено в ECMAScript 2015, // и должно быть явно присвоено.// Ключевое слово `const` означает константу, поэтому переменную нельзя переназначить // так как значение -` константа`. const  z  =  "это значение нельзя переназначить!" ;// Объявляет переменную с именем `myNumber` и присваивает ей числовой литерал ( // значение` 2`). пусть  myNumber  =  2 ;// Переназначает `myNumber`, устанавливая его в строковый литерал (значение` "foo" `). // JavaScript - это язык с динамической типизацией, поэтому это допустимо. myNumber  =  "foo" ;

Обратите внимание на комментарии в приведенном выше примере, которым предшествовали две косые черты .

В JavaScript нет встроенных функций ввода / вывода ; среда выполнения обеспечивает это. В спецификации ECMAScript в редакции 5.1 упоминается: [65]

действительно, в этой спецификации нет положений для ввода внешних данных или вывода вычисленных результатов.

Однако в большинстве сред выполнения есть consoleобъект [66], который можно использовать для вывода на печать. Вот минималистичная программа Hello World на JavaScript:

консоль . журнал ( «Привет, мир!» );

Простая рекурсивная функция:

функция  factorial ( n )  {  if  ( n  ===  0 )  return  1 ;  // 0! = 1 вернуть  n  *  факториал ( n  -  1 ); }факториал ( 3 );  // возвращает 6

Функция анонимного (или лямбда):

функция  counter ()  {  let  count  =  0 ;  функция возврата ()  {  счетчик возврата  ++ ; }; } let  closure  =  counter (); закрытие ();  // возвращает 1 closure ();  // возвращает 2 closure ();  // возвращает 3

Этот пример показывает, что в JavaScript закрытие функций захватывает их нелокальные переменные по ссылке.

Стрелочные функции были впервые представлены в 6-м издании - ECMAScript 2015 . Они сокращают синтаксис для написания функций на JavaScript. Стрелочные функции анонимны по своей природе; переменная необходима для ссылки на них, чтобы вызывать их после их создания.

Пример стрелочной функции:

// Стрелочные функции позволяют опускать ключевое слово `function`. // Здесь `long_example` указывает на значение анонимной функции. const  long_example  =  ( input1 ,  input2 )  =>  {  console . log ( "Привет, мир!" );  const  output  =  input1  +  input2 ; возвратный  вывод ; };// Если фигурных скобок нет, стрелочная функция просто возвращает выражение // Итак, вот оно (input1 + input2) const  short_example  =  ( input1 ,  input2 )  =>  input1  +  input2 ;long_example ( 2 ,  3 );  // Выводит "Hello, World!" и возвращает 5 short_example ( 2 ,  5 );  // Возвращает 7// Если стрелочная функция имеет только один параметр, скобки можно удалить. const  no_parentheses  =  input  =>  input  +  2 ;no_parentheses ( 3 );  // Возвращает 5

В JavaScript объекты создаются так же, как и функции; это называется функциональным объектом .

Пример объекта:

функция  Ball ( r )  {  this . радиус  =  r ;  // аргумент "r" является локальным для объекта шара  this . площадь  =  Математика . ПИ  *  ( г  **  2 );  // круглые скобки ничего не делают, кроме пояснения  // объекты могут содержать функции ("метод")  this . show  =  function ()  {  drawCircle ( this . radius );  // ссылается на другую функцию (рисующую круг)  }; }let  myBall  =  новый  мяч ( 5 );  // создает новый экземпляр объекта шара с радиусом 5 myBall . радиус ++ ;  // свойства объекта обычно можно изменить извне myBall . шоу ();  // используя унаследованную функцию "show"

Демонстрация функции Variadic ( argumentsэто специальная переменная ): [67]

function  sum ()  {  пусть  x  =  0 ; for  ( let  i  =  0 ;  i  <  arguments . length ;  ++ i )  x  + =  arguments [ i ]; вернуть  x ; }сумма ( 1 ,  2 );  // возвращает 3 sum ( 1 ,  2 ,  3 );  // возвращает 6

Сразу вызываемые функциональные выражения часто используются для создания замыканий. Замыкания позволяют собирать свойства и методы в пространстве имен и делать некоторые из них закрытыми:

let  counter  =  ( function ()  {  let  i  =  0 ;  // частная собственность return  {  // общедоступные методы  get :  function ()  {  alert ( i );  },  набор :  функция ( значение )  {  я  =  значение ;  },  приращение :  функция ()  {  предупреждение ( ++ i );  }  }; }) ();  // модульсчетчик . получить ();  // показывает 0 счетчик . набор ( 6 ); счетчик . инкремент ();  // показывает счетчик 7 . инкремент ();  // показывает 8

Экспорт и импорт модулей в JavaScript [68]

Пример экспорта:

/ * mymodule.js * / // Эта функция остается частной, так как она не экспортируется let  sum  =  ( a ,  b )  =>  {  return  a  +  b ; }// Экспорт переменных export  let  name  =  'Alice' ; экспорт  let  age  =  23 ;// Экспорт именованные функции экспорта  функции  дополнения ( num1 ,  num2 )  {  возвращение  num1  +  num2 ; }// класс экспорта экспорта  класс  Умножение  {  конструктор ( num1 ,  num2 )  {  это . число1  =  число1 ;  это . число2  =  число2 ;  } add ()  {  вернуть  сумму ( this . num1 ,  this . num2 );  } }

Пример импорта:

// Импортируем одно свойство import  {  add  }  из  './mymodule.js' ;консоль . журнал ( добавить ( 1 ,  2 ));  // 3// Импорт нескольких свойств import  {  name ,  age  }  из  './mymodule.js' ; консоль . журнал ( имя ,  возраст ); //> «Алиса», 23// Импортировать все свойства из модуля import  *  из  консоли './module.js' . журнал ( имя , возраст ); //> «Алиса», 23 консоль . журнал ( добавить ( 1 , 2 )); //> 3 

Более сложный пример [ править ]

Этот пример кода отображает различные функции JavaScript.

/ * Находит наименьшее общее кратное (НОК) двух чисел * / function  LCMCalculator ( x ,  y )  {  // функция-конструктор  let  checkInt  =  function ( x )  {  // внутренняя функция  if  ( x  %  1  ! ==  0 )  throw  new  TypeError ( x  +  «не целое число» );  // var a = mouseX вернуть  x ;  };  это . = checkInt ( х ) // ^^^^ точка с запятой не являются обязательными, символ новой строки достаточно этого . b = checkInt ( y ); } // Прототип экземпляров объекта, созданных конструктором, // это свойство "prototype" конструктора. LCMCalculator . prototype = { // конструктор литерала объекта : LCMCalculator , // при переназначении прототипа соответствующим образом установите свойство конструктора gcd : function () {                // метод вычисления наибольшего общего делителя  // алгоритм Евклида:  let  a  =  Math . абс ( this . a ),  b  =  Math . абс ( это . б ),  т ; if  ( a  <  b )  {  // меняем местами переменные  // t = b; б = а; а = т;  [ а ,  б ]  =  [ б ,  а ];  // свопинг с использованием деструктурирующего присваивания (ES6)  } в то время как  ( b  ! ==  0 )  {  t  =  b ;  b  =  a  %  b ;  а  =  т ;  } // Необходимо вычислить GCD только один раз, поэтому "переопределите" этот метод.  // (На самом деле не переопределение - он определен в самом экземпляре,  // так что this.gcd ссылается на это «переопределение» вместо LCMCalculator.prototype.gcd.  // Обратите внимание, что это приводит к неверному результату, если члены объекта LCMCalculator "a" и / или "b" впоследствии изменяются.)  // Также, 'gcd' === "gcd", this ['gcd'] === this.gcd  this [ 'gcd' ]  =  function ()  {  вернуться  ; };  вернуться  ; },  // Имена свойств объекта могут быть указаны строками, разделенными двойными (") или одинарными (') кавычками.  Lcm :  function ()  {  // Имена переменных не конфликтуют со свойствами объекта, например, | lcm | не | this. lcm |.  // не используется | this.a * this.b |, чтобы избежать проблем с точностью FP  let  lcm  =  this . a  /  this . gcd ()  *  this . b ;  // Необходимо вычислить lcm только один раз, поэтому "переопределите" этот метод.  это . lcm  =  function ()  {  return  lcm ;  }; возврат  lcm ;  }, toString :  function ()  {  return  "LCMCalculator: a ="  +  this . a  +  ", b ="  +  это . б ;  } };// Определить общую функцию вывода; эта реализация работает только для функции  output ( x )  {  document в веб-браузерах . тело . appendChild ( документ . createTextNode ( x ));  документ . тело . appendChild ( документ . createElement ( 'br' )); }// Примечание: map () и forEach () массива определены в JavaScript 1.6. // Они используются здесь, чтобы продемонстрировать присущую JavaScript функциональную природу. [  [ 25 ,  55 ],  [ 21 ,  56 ],  [ 22 ,  58 ],  [ 28 ,  56 ] ]. map ( function ( pair )  {  // литерал массива + функция сопоставления  возвращают  новый  LCMCalculator ( pair [ 0 ],  pair [ 1 ]); }).sort (( a ,  b )  =>  a . lcm ()  -  b . lcm ())  // сортировать с помощью этой сравнительной функции; => - это сокращенная форма функции, называемой «стрелочная функция»  . forEach ( printResult );функция  printResult ( obj )  {  output ( obj  +  ", gcd ="  +  obj . gcd ()  +  ", lcm ="  +  obj . lcm ()); }

Следующий вывод должен отображаться в окне браузера.

Калькулятор LCMC: a = 28, b = 56, gcd = 28, lcm = 56LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168Калькулятор LCMC: a = 25, b = 55, gcd = 5, lcm = 275Калькулятор LCMC: a = 22, b = 58, gcd = 2, lcm = 638

Безопасность [ править ]

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

Существуют подмножества общего JavaScript - ADsafe, Secure ECMAScript (SES) - которые обеспечивают более высокий уровень безопасности, особенно для кода, созданного третьими сторонами (например, для рекламы). [69] [70] Caja - еще один проект по безопасному внедрению и изоляции сторонних JavaScript и HTML.

Политика безопасности контента - это основной предполагаемый метод обеспечения того, чтобы на веб-странице выполнялся только доверенный код.

Межсайтовые уязвимости [ править ]

Распространенной проблемой безопасности, связанной с JavaScript, является межсайтовый скриптинг (XSS), нарушение политики одного и того же происхождения . XSS-уязвимости возникают, когда злоумышленник может заставить целевой веб-сайт, такой как веб-сайт онлайн-банкинга, включить вредоносный сценарий на веб-страницу, представленную жертве. Затем сценарий в этом примере может получить доступ к банковскому приложению с привилегиями жертвы, потенциально раскрывая секретную информацию или переводя деньги без разрешения жертвы. Решением XSS-уязвимостей является использование экранирования HTML при отображении ненадежных данных.

Некоторые браузеры включают частичную защиту от отраженных XSS-атак, когда злоумышленник предоставляет URL-адрес, содержащий вредоносный скрипт. Однако даже пользователи этих браузеров уязвимы для других XSS-атак, например тех, при которых вредоносный код хранится в базе данных. Только правильный дизайн веб-приложений на стороне сервера может полностью предотвратить XSS.

Уязвимости XSS также могут возникать из-за ошибок реализации авторами браузеров. [71]

Другая межсайтовая уязвимость - это подделка межсайтовых запросов (CSRF). В CSRF код на сайте злоумышленника обманом заставляет браузер жертвы выполнять действия, которые пользователь не планировал на целевом сайте (например, перевод денег в банк). Когда целевые сайты полагаются исключительно на файлы cookie для аутентификации запросов, запросы, исходящие из кода на сайте злоумышленника, могут содержать те же действительные учетные данные для входа, что и инициирующий пользователь. В общем, решение CSRF состоит в том, чтобы требовать значение аутентификации в скрытом поле формы, а не только в файлах cookie, для аутентификации любого запроса, который может иметь долгосрочные последствия. Также может помочь проверка заголовка HTTP-реферера.

«Перехват JavaScript» - это тип CSRF-атаки, при которой <script>тег на сайте злоумышленника использует страницу на сайте жертвы, которая возвращает конфиденциальную информацию, такую ​​как JSON или JavaScript. Возможные решения включают:

  • требовать токена аутентификации в параметрах POST и GET для любого ответа, который возвращает личную информацию.

Неуместное доверие к клиенту [ править ]

Разработчики клиент-серверных приложений должны понимать, что ненадежные клиенты могут находиться под контролем злоумышленников. Автор приложения не может предполагать, что его код JavaScript будет работать должным образом (или вообще), потому что любой секрет, встроенный в код, может быть извлечен определенным противником. Некоторые последствия:

  • Авторы веб-сайтов не могут полностью скрыть, как работает их JavaScript, потому что необработанный исходный код должен быть отправлен клиенту. Код можно запутать , но запутывание можно перепроектировать.
  • Проверка формы JavaScript обеспечивает только удобство для пользователей, но не безопасность. Если сайт проверяет, согласен ли пользователь с его условиями обслуживания, или отфильтровывает недопустимые символы из полей, которые должны содержать только числа, он должен сделать это на сервере, а не только на клиенте.
  • Сценарии можно выборочно отключить, поэтому нельзя полагаться на JavaScript для предотвращения таких операций, как щелчок правой кнопкой мыши по изображению для его сохранения. [72]
  • Встраивание конфиденциальной информации, такой как пароли, в JavaScript, считается очень плохой практикой, поскольку она может быть извлечена злоумышленником. [73]

Неуместное доверие к разработчикам [ править ]

Системы управления пакетами, такие как npm и Bower, популярны среди разработчиков JavaScript. Такие системы позволяют разработчику легко управлять зависимостями своей программы от программных библиотек других разработчиков. Разработчики верят, что сопровождающие библиотеки будут держать их в безопасности и обновлять, но это не всегда так. Из-за этого слепого доверия возникла уязвимость. У зависимых библиотек могут быть новые выпуски, которые вызывают ошибки или уязвимости во всех программах, которые полагаются на библиотеки. И наоборот, библиотека может остаться незамеченной из-за известных уязвимостей. В исследовании, проведенном на выборке из 133 тыс. Веб-сайтов, исследователи обнаружили, что 37% веб-сайтов включают библиотеки, по крайней мере, с одной известной уязвимостью. [74]«Среднее отставание между самой старой версией библиотеки, используемой на каждом веб-сайте, и последней доступной версией этой библиотеки в ALEXA составляет 1177 дней, а разработка некоторых библиотек, которые все еще активно используются, прекратилась много лет назад». [74] Другая возможность состоит в том, что сопровождающий библиотеки может полностью удалить библиотеку. Это произошло в марте 2016 года, когда Азер Кочулу удалил свой репозиторий из npm . Это привело к поломке всех десятков тысяч программ и веб-сайтов, зависящих от его библиотек. [75] [76]

Ошибки кодирования браузера и плагина [ править ]

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

Эти недостатки затронули основные браузеры, включая Firefox, [77] Internet Explorer [78] и Safari. [79]

Плагины, такие как видеоплееры, Adobe Flash и широкий спектр элементов управления ActiveX, включенных по умолчанию в Microsoft Internet Explorer, также могут иметь недостатки, которые можно использовать с помощью JavaScript (такие недостатки использовались в прошлом). [80] [81]

В Windows Vista Microsoft попыталась ограничить риски ошибок, таких как переполнение буфера, запустив процесс Internet Explorer с ограниченными привилегиями. [82] Google Chrome также ограничивает средства визуализации страниц своей собственной «песочницей».

Ошибки реализации песочницы [ править ]

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

Неправильное предоставление привилегий JavaScript из Интернета сыграло роль в появлении уязвимостей как в Internet Explorer [83], так и в Firefox. [84] В Windows XP с пакетом обновления 2 (SP2) Microsoft снизила права JScript в Internet Explorer. [85]

Microsoft Windows позволяет запускать исходные файлы JavaScript на жестком диске компьютера как универсальные программы без изолированной программной среды (см .: Windows Script Host ). Это делает JavaScript (например, VBScript ) теоретически жизнеспособным вектором для троянского коня , хотя на практике троянские кони JavaScript - редкость. [86] [ неудачная проверка ]

Аппаратные уязвимости [ править ]

В 2015 году исследователи в области безопасности описали экспериментальную реализацию атаки Rowhammer на основе JavaScript . [87] [88] [89] [90]

В 2017 году была продемонстрирована атака на основе JavaScript через браузер, способная обойти ASLR . Это называется «ASLR⊕Cache» или AnC. [91] [92]

В 2018 году документ, в котором объявлялись об атаках Spectre на спекулятивное выполнение в Intel и других процессорах, содержал реализацию JavaScript. [93]

Инструменты разработки [ править ]

Важные инструменты эволюционировали вместе с языком.

  • Каждый крупный веб-браузер имеет встроенные инструменты веб-разработки , включая отладчик JavaScript .
  • Статический анализ программ инструменты, такие как ESLint и JSLint , сканирования кода JavaScript на соответствие набору стандартов и руководящих принципов.
  • Некоторые браузеры имеют встроенные профилировщики . Также были созданы автономные библиотеки профилирования, такие как benchmark.js и jsbench. [94] [95]
  • Многие текстовые редакторы поддерживают подсветку синтаксиса для кода JavaScript.

Связанные технологии [ править ]

Java [ править ]

Распространенное заблуждение состоит в том, что JavaScript похож или тесно связан с Java . Верно, что оба имеют синтаксис, подобный C (язык C является их непосредственным общим предком). Они также обычно являются изолированными (при использовании внутри браузера), а JavaScript был разработан с учетом синтаксиса Java и стандартной библиотеки. В частности, все ключевые слова Java были зарезервированы в исходном JavaScript, стандартная библиотека JavaScript следует соглашениям об именах Java, а JavaScript Mathи Dateобъекты основаны на классах из Java 1.0 [96], но на этом сходство заканчивается.

И Java, и JavaScript впервые появились в 1995 году, но Java был разработан Джеймсом Гослингом из Sun Microsystems, а JavaScript - Бренданом Эйхом из Netscape Communications.

Различия между двумя языками более заметны, чем их сходство. В Java используется статическая типизация , а в JavaScript - динамическая . Java загружается из скомпилированного байт-кода, а JavaScript загружается как читаемый человеком исходный код. Объекты Java основаны на классах , а объекты JavaScript - на прототипах . Наконец, Java не поддерживала функциональное программирование до Java 8, в то время как JavaScript поддерживал это с самого начала, находясь под влиянием Scheme .

JSON [ править ]

JSON или нотация объектов JavaScript - это универсальный формат обмена данными, который определяется как подмножество синтаксиса литерала объекта JavaScript.

WebAssembly [ править ]

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

asm.js - это подмножество JavaScript, которое послужило предшественником WebAssembly. [98]

Транспилеры [ править ]

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

Ссылки [ править ]

  1. ^ a b Пресс-релиз, объявляющий о JavaScript , «Netscape и Sun объявляют о JavaScript», PR Newswire, 4 декабря 1995 г.
  2. ^ "Стандартный ECMA-262" . Ecma International. 17 июня 2020 г.
  3. ^ "nodejs / node-eps" . GitHub .
  4. ^ a b Сейбел, Питер (16 сентября 2009 г.). Кодеры за работой: размышления о ремесле программирования . ISBN 9781430219484. Проверено 25 декабря 2018 года . Эйх: Непосредственно Netscape беспокоила, что он должен выглядеть как Java.
  5. ^ a b c d e «Глава 4. Как создавался JavaScript» . speakjs.com .
  6. ^ «Брендан Эйх: Введение в JavaScript, JSConf 2010» . п. 22м . Проверено 25 ноября 2019 года . Эйх: «функция», восемь букв, на меня повлиял AWK.
  7. Перейти ↑ Eich, Brendan (1998). «Предисловие». В Гудмане, Дэнни (ред.). Библия JavaScript (3-е изд.). Джон Вили и сыновья . ISBN 0-7645-3188-3. LCCN  97078208 . OCLC  38888873 . ПР  712205М .
  8. ^ «JavaScript» . Словарь английского языка Коллинза - полное и несокращенное цифровое издание 2012 года . Уильям Коллинз Sons & Co. 2012 . Проверено 21 августа 2015 года .
  9. ^ «Спецификация языка ECMAScript® 2020» .
  10. ^ Фланаган, Дэвид. JavaScript - Полное руководство (6 изд.). п. 1. JavaScript является частью триады технологий, которую должны изучить все веб-разработчики: HTML для определения содержимого веб-страниц, CSS для определения представления веб-страниц и JavaScript для определения поведения веб-страниц.
  11. ^ a b «Статистика использования JavaScript как клиентского языка программирования на веб-сайтах» . w3techs.com . Проверено 21 февраля 21 .
  12. ^ "Bloomberg Game Changers: Марк Андриссен" . Блумберг. 17 марта 2011 . Проверено 7 декабря 2011 года .
  13. ^ Enzer, Ларри (31 августа 2018). «Эволюция веб-браузеров» . Веб-разработчики Монмута . Проверено 31 августа 2018 года .
  14. ^ «TechVision: новаторы в сети: Брендан Эйх и JavaScript» . Архивировано из оригинала 8 февраля 2008 года.
  15. Fin JS (17 июня 2016 г.), Брендан Эйх - генеральный директор Brave , получено 7 февраля 2018 г.
  16. ^ a b Champeon, Стив (6 апреля 2001 г.). "JavaScript, как мы сюда попали?" . oreilly.com . Архивировано из оригинального 19 июля 2016 года . Проверено 16 июля, 2016 .
  17. ^ «Доступна бета-версия Microsoft Internet Explorer 3.0» . microsoft.com . Microsoft. 29 мая 1996 . Проверено 16 июля, 2016 .
  18. McCracken, Гарри (16 сентября 2010 г.). «Нежеланное возвращение« Лучшего просмотра с Internet Explorer » » . technologizer.com . Проверено 16 июля, 2016 .
  19. ^ «Доля рынка интернет-браузеров Mozilla Firefox увеличилась до 7,4%» . Журнал поисковых систем. 24 ноября 2004 . Проверено 7 декабря 2011 года .
  20. Вебер, Тим (9 мая 2005 г.). «Нападение на софтверного гиганта Microsoft» . BBC News . Архивировано из оригинального 25 сентября 2017 года.
  21. ^ «Большой сравнительный тест браузеров: Internet Explorer против Firefox, Opera, Safari и Chrome» . Оборудование для компьютерных игр . Computec Media AG . Проверено 28 июня 2010 года .
  22. ^ «Тесты скорости Lifehacker: Safari 4, Chrome 2» . Лайфхакер . Проверено 28 июня 2010 года .
  23. ^ «TraceMonkey: JavaScript Lightspeed, блог Брендана Эйха» . Проверено 22 июля 2020 года .
  24. ^ «Mozilla спрашивает:« Мы уже быстро? » » . Проводной . Проверено 18 января 2019 года .
  25. ^ «ECMAScript 6: Новые возможности: обзор и сравнение» . es6-features.org . Проверено 19 марта 2018 года .
  26. ^ a b Бранскомб, Мэри (4 мая 2016 г.). «Стандарт JavaScript переходит к годовому графику выпуска; вот что нового в ES16» . Новый стек . Проверено 15 января 20 .
  27. ^ "Процесс TC39" . tc39.es . Ecma International . Проверено 15 января 20 .
  28. ^ "Предложения ECMAScript" . TC39 . Проверено 15 января 20 .
  29. ^ a b Ашкенас, Джереми . «Список языков, компилируемых в JS» . Проверено 6 февраля 2020 года .
  30. ^ "Торговая марка США, серийный номер 75026640" . USPTO.
  31. ^ «Торговые марки Sun» . Sun Microsystems. Архивировано из оригинального 28 мая 2010 года . Проверено 8 ноября 2007 года .
  32. ^ a b c «Статистика использования библиотек JavaScript для веб-сайтов» . w3techs.com .
  33. ^ "Ванильный JS" . vanilla-js.com . Проверено 17 июня, 2020 .
  34. Netscape Communications Corporation (11 декабря 1998 г.). «Руководство по серверному JavaScript» . oracle.com . Корпорация Netscape Communications . Проверено 16 июля, 2016 .
  35. ^ Clinick, Эндрю (14 июля 2000). «Знакомство с JScript .NET» . Сеть разработчиков Microsoft . Microsoft . Проверено 10 апреля 2018 года . [S] После введения в 1996 году JScript версии 1.0 ... мы наблюдаем неуклонное увеличение использования JScript на сервере, особенно в Active Server Pages (ASP)
  36. ^ a b Mahemoff, Майкл (17 декабря 2009 г.). «Серверный JavaScript, назад с местью» . readwrite.com . Проверено 16 июля, 2016 .
  37. ^ «JavaScript для Acrobat» . Проверено 18 августа 2009 года .
  38. ^ "Отвечая на вопрос:" Как мне разработать приложение для GNOME? " " " .
  39. ^ «Tessel 2 ... Используйте все библиотеки Node.JS для создания полезных устройств с Tessel за считанные минуты» .
  40. ^ «Введение в Node.js Raspberry Pi GPIO» .
  41. ^ «Espruino - JavaScript для микроконтроллеров» .
  42. Рианна Фланаган, Дэвид (17 августа 2006 г.). JavaScript: Полное руководство: Полное руководство . "O'Reilly Media, Inc.". п. 16. ISBN 978-0-596-55447-7.
  43. ^ a b c d "Причуды JavaScript в одном изображении из Интернета" . Сообщество DEV . Проверено 28 октября 2019 года .
  44. ^ "Ват" . www.destroyallsoftware.com . Проверено 28 октября 2019 года .
  45. ^ "Типы данных и структуры данных JavaScript - JavaScript | MDN" . Developer.mozilla.org . 16 февраля 2017 . Проверено 24 февраля 2017 года .
  46. ^ Фланаган 2006 , стр. 176-178.
  47. ^ Крокфорд, Дуглас. «Прототипное наследование в JavaScript» . Проверено 20 августа 2013 года .
  48. ^ «Наследование и цепочка прототипов» . Сеть разработчиков Mozilla . Mozilla . Проверено 6 апреля 2013 года .
  49. ^ Герман, Дэвид (2013). Эффективный JavaScript . Эддисон-Уэсли. п. 83. ISBN 978-0-321-81218-6.
  50. ^ Haverbeke, Marijn (2011). Красноречивый JavaScript . Пресс без крахмала. С. 95–97. ISBN 978-1-59327-282-1.
  51. ^ Кац, Иегуда. «Понимание« прототипов »в JavaScript» . Проверено 6 апреля 2013 года .
  52. ^ Герман, Дэвид (2013). Эффективный JavaScript . Эддисон-Уэсли. С. 125–127. ISBN 978-0-321-81218-6.
  53. ^ «Свойства функционального объекта» . Es5.github.com . Проверено 26 мая 2013 года .
  54. Перейти ↑ Flanagan 2006 , p. 141.
  55. ^ Многочисленные возможности JavaScript для обобщения подходов к ролевому программированию, таких как Traits и Mixins, Peterseliger.blogpsot.de, 11 апреля 2014 г.
  56. ^ Traits for JavaScript , 2010.
  57. ^ "Главная | CocktailJS" . Cocktailjs.github.io . Проверено 24 февраля 2017 года .
  58. ^ Ангус Кролл, Свежий взгляд на миксины JavaScript , опубликовано 31 мая 2011 г.
  59. ^ «Модель параллелизма и цикл событий» . Сеть разработчиков Mozilla . Проверено 28 августа 2015 года .
  60. ^ Haverbeke, Marijn (2011). Красноречивый JavaScript . Пресс без крахмала. С. 139–149. ISBN 978-1-59327-282-1.
  61. ^ «E4X - Архив устаревшего контента | MDN» . Сеть разработчиков Mozilla . Mozilla Foundation. 14 февраля 2014 . Проверено 13 июля 2014 года .
  62. ^ "var - JavaScript - MDN" . Сеть разработчиков Mozilla . Проверено 22 декабря 2012 года .
  63. ^ "пусть" . Веб-документы MDN . Mozilla . Проверено 27 июня 2018 года .
  64. ^ "const" . Веб-документы MDN . Mozilla . Проверено 27 июня 2018 года .
  65. ^ «Спецификация языка ECMAScript - ECMA-262 Edition 5.1» . Ecma International . Проверено 22 декабря 2012 года .
  66. ^ "консоль" . Сеть разработчиков Mozilla . Mozilla . Проверено 6 апреля 2013 года .
  67. ^ "аргументы" . Сеть разработчиков Mozilla . Mozilla . Проверено 6 апреля 2013 года .
  68. ^ «Импорт и экспорт модулей в javascript» . Learnersbucket.com . Проверено 23 апреля 2019 года .
  69. ^ «Сделать JavaScript безопасным для рекламы» . ADsafe . Проверено 26 мая 2013 года .
  70. ^ "Безопасный сценарий ECMA (SES)" . Проверено 26 мая 2013 года .
  71. ^ "Уязвимость межсайтового скриптинга Mozilla обнаружена и исправлена ​​- MozillaZine Talkback" . Mozillazine.org . Проверено 24 февраля 2017 года .
  72. ^ "Щелкните правой кнопкой мыши" защиту "? Забудьте об этом" . 17 июня 2008 г. ISSN 1797-1993 . Архивировано из оригинала 9 августа 2011 года . Проверено 17 июня 2008 года .  Cite journal requires |journal= (help)
  73. ^ Рехорик, Ян. «Почему вы никогда не должны помещать конфиденциальные данные в свой JavaScript» . Блог ServiceObjects . ServiceObjects . Проверено 3 июня 2019 года .
  74. ^ а б Лауингер, Тобиас; Чаабане, Абдельбери; Аршад, Саджад; Робертсон, Уильям; Уилсон, Христо; Кирда, Энгин (21 декабря 2016 г.). «Не полагайся на меня: анализ использования устаревших библиотек JavaScript в Интернете» (PDF) . Труды 2017 Симпозиум по безопасности сетей и распределенных систем . arXiv : 1811.00918 . DOI : 10.14722 / ndss.2017.23414 . ISBN  978-1-891562-46-4. S2CID  17885720 . Архивировано из оригинального (PDF) 29 марта 2017 года . Проверено 22 февраля 2017 года .
  75. Рианна Коллинз, Кейт (27 марта 2016 г.). «Как один программист взломал Интернет, удалив крошечный фрагмент кода» . Кварц .
  76. ^ SC Magazine UK, 11 строк удаленного кода разработчика «ломают Интернет». Архивировано 23 февраля 2017 г. в Wayback Machine.
  77. ^ Mozilla Corporation, Переполнение буфера в crypto.signText ()
  78. Festa, Paul (19 августа 1998 г.). «Ошибка переполнения буфера в IE» . CNET . Архивировано из оригинала 25 декабря 2002 года.
  79. ^ SecurityTracker.com, переполнение буфера JavaScript в Apple Safari позволяет удаленным пользователям выполнять произвольный код, а ошибка перенаправления HTTP позволяет удаленным пользователям получать доступ к файлам.
  80. ^ SecurityFocus, Уязвимость переполнения буфера элемента управления ActiveX Microsoft WebViewFolderIcon
  81. ^ Fusion Authority, Macromedia Flash ActiveX Переполнение буфера архивации 13 августа 2011, в Wayback Machine
  82. ^ «Защищенный режим в Vista IE7 - IEBlog» . Blogs.msdn.com . 9 февраля 2006 . Проверено 24 февраля 2017 года .
  83. ^ US CERT, Примечание об уязвимости VU # 713878: Microsoft Internet Explorer неправильно проверяет источник перенаправленного кадра.
  84. ^ Mozilla Foundation, Mozilla Foundation Security Advisory 2005–41: повышение привилегий с помощью переопределения свойств DOM.
  85. ^ Корпорация Microsoft, Изменения функциональности в Microsoft Windows XP с пакетом обновления 2: Часть 5: Повышенная безопасность просмотра
  86. ^ Один из примеров редкого троянского коня JavaScript см. В Symantec Corporation, JS.Seeker.K
  87. ^ Грусс, Даниэль; Морис, Клементина; Мангард, Стефан (24 июля 2015 г.). «Rowhammer.js: удаленная программно-индуцированная атака на JavaScript». arXiv : 1507.06955 [ cs.CR ].
  88. ^ Жан-Pharuns, Аликс (30 июля 2015). «Rowhammer.js - самый гениальный взлом, который я когда-либо видел» . Материнская плата . Vice .
  89. ^ Goodin, Dan (4 августа 2015). «Эксплойт DRAM 'Bitflipping' для атак на ПК: просто добавьте JavaScript» . Ars Technica .
  90. Ауэрбах, Давид (28 июля 2015 г.). «Эксплойт безопасности Rowhammer: почему новая атака на систему безопасности действительно ужасает» . slate.com . Проверено 29 июля 2015 года .
  91. ^ AnC VUSec, 2017
  92. ^ Новый JavaScript, блокирующий ASLR, собирается сделать проездные эксплойты намного более отвратительными Ars Technica, 2017
  93. ^ Атака призраком Атака призраком
  94. ^ "Benchmark.js" . benchmarkjs.com .
  95. ^ JSBEN.CH. "JSBEN.CH Площадка для тестирования производительности JavaScript" . jsben.ch .
  96. Перейти ↑ Eich, Brendan (3 апреля 2008 г.). «Популярность» . Проверено 19 января 2012 года .
  97. ^ «Edge Browser переключает WebAssembly на« On »- Visual Studio Magazine» . Журнал Visual Studio .
  98. ^ "часто задаваемые вопросы" . asm.js . Проверено 13 апреля 2014 года .

Дальнейшее чтение [ править ]

  • Красноречивый JavaScript ; 3-е изд; Марин Хавербеке; Пресс без крахмала; 472 страницы; 2018; ISBN 978-1593279509 . (скачать) 
  • Принципы объектно-ориентированного JavaScript ; 1-е изд; Николас Закас; Пресс без крахмала; 120 страниц; 2014; ISBN 978-1593275402 . 

Внешние ссылки [ править ]

Послушайте эту статью ( 48 минут )
Разговорный значок Википедии
Этот аудиофайл был создан на основе редакции этой статьи от 20 августа 2013 года и не отражает последующих правок. (2013-08-20)
  • JavaScript в Curlie
  • Дуглас Крокфорд «s видео лекции по JavaScript