Общий обзор
- 4. Общее описание
-
Данный раздел не является нормативным и содержит общее описание языка ECMAScript.
ECMAScript - объектно-ориентированный язык программирования, предназначенный для проведения вычислений и манипуляций с вычислительными объектами в среде выполнения. ECMAScript в том виде, в каком он описывается здесь, не предназначен для использования в качестве самодостаточной вычислительной системы. В данной спецификации отсутствуют средства ввода внешних данных или вывода результатов. Вместо этого ожидается, что вычислительная среда программы на ECMAScript предоставит не только объекты и прочие средства, описанные в данной статье, но также некоторые зависящие от конкретной платформы объекты среды, описание поведения которых не входит в задачи данной спецификации, за исключением указания того факта, что они могут предоставлять некоторые определённые свойства, к которым можно обратиться, и определённые функции, которые можно вызвать из программы на ECMAScript.
Скриптовый язык - язык программирования, который используется для управления, настройки и автоматизации средств существующей системы. В подобных системах полезная функциональность уже доступна посредством пользовательского интерфейса, и скриптовый язык является механизмом предоставления доступа к этой функциональности для программного кода. С этой точки зрения можно сказать, что существующая система предоставляет среду объектов и средств, которая дополняет возможности скриптового языка. Скриптовый язык предназначен для использования как профессиональными, так и непрофессиональными программистами. Для удобства непрофессиональных программистов некоторые аспекты языка могут быть несколько упрощены.
Изначально ECMAScript был разработан как язык веб-скриптов и был призван предоставлять механизм для "оживления" веб-страниц в браузерах и для произведения серверных вычислений в качестве части клиент-серверной архитектуры в вебе. ECMAScript может предоставлять скриптовые возможности для широкого набора сред, поэтому основа скриптового языка описана в данном документе без привязки к какой-либо среде выполнения.
Некоторые из средств ECMAScript являются аналогичными тем, которые используются в других языках программирования, в частности Java и Self. Описания этих языков можно найти в следующих книгах:
- Gosling, James, Bill Joy and Guy Steele. The Java™ Language
Specification. Addison Wesley Publishing Co., 1996.
- Ungar, David, and Smith, Randall B. Self: The Power of
Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando,
FL, October 1987.
- 4.1 Скрипты для интернет
-
Веб-браузер предоставляет среду выполнения ECMAScript для клиентской стороны вычислений, включая, например, объекты, которые представляют окна, меню, всплывающие окна, диалоговые окна, текстовые поля, ссылки, фреймы, историю переходов, cookies и ввод-вывод. Кроме того, среда выполнения предоставляет способы для подключения кода к событиям, таким как переход фокуса, загрузка страниц и изображений, выгрузка, ошибка и отмена, выбор, отсылка форм и действия мыши. Скриптовый код включается в HTML, и отображаемая страница представляет собой комбинацию элементов пользовательского интерфейса и статичных и вычисленных текстов и изображений. Скриптовый код реагирует на действия пользователя, и, таким образом, не требует наличия основной программы.
Веб-сервер предоставляет другую среду выполнения для серверных вычислений, включающую объекты, представляющие запросы, клиенты и файлы, и механизмы для блокировки и разделения данных. Путём совместного использования браузерных и клиентских скриптов становится возможным распределить вычисления между клиентом и сервером, в то же время реализуя сложный интерфейс веб-приложения.
Каждый веб-браузер и сервер, который поддерживает ECMAScript, предоставляет свою собственную среду, дополняя среду выполнения ECMAScript.
- 4.2 Общее описание языка
-
Далее следует неформальное описание языка ECMAScript - описываются не все части языка. Это общее описание не является частью собственно стандарта.
ECMAScript является объектным языком: базовый язык и средства среды предоставлены в виде объектов, и программа на ECMAScript представляет совокупность общающихся объектов. Объект ECMAScript представляет собой неупорядоченный набор свойств, каждое из которых обладает нулём или более атрибутов, которые определяют, как может использоваться каждое из свойств (например, когда атрибут ReadOnly установлен в true, любая попытка выполняемого кода на ECMAScript изменить значение этого свойства не возымеет результата. Свойства являются контейнерами, содержащими другие объекты, элементарные значения или методы. Элементарное значение - значение, имеющее один из следующих встроенных типов: Undefined, Null, Boolean, Number или String. Объект - значение, имеющее последний оставшийся встроенный тип Object; а метод является функцией, связанной с объектом через свойство.
ECMAScript определяет набор встроенных объектов, которые завершают определение сущностей ECMAScript. К этим встроенным объектам принадлежат объекты Global, Object, Function, Array, String, Boolean, Number, Math, Date, RegExp и объекты Error: Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError и URIError.
ECMAScript также определяет набор встроенных операторов, которые могут представлять собой, строго говоря, функции или методы. Операторы ECMAScript включают различные унарные операции, мультипликативные операторы, аддитивные операторы, операторы побитового сдвига, операторы отношения, операторы равенства, двоичные побитовые операторы, двоичные логические операторы, операторы присваивания и оператор-запятую.
Синтаксис ECMAScript намеренно сделан напоминающим синтаксис языка Java. Синтаксис ECMAScript является упрощённым, чтобы позволить ему быть использованным в качестве легкодоступного скриптового языка. Например, не требуется объявлять тип переменной или свойства, а объявления определяемых функций не обязаны предшествовать их вызовам.
- 4.2.1 Объекты
-
ECMAScript не содержит классов в строгом понимании этого слова, как в C++, Smalltalk или Java, но вместо этого поддерживает конструкторы, которые создают объект путём выполнения кода, который выделяет память для объектов и инициализирует их полностью или частично путём присвоения начальных значений их свойствам. Все конструкторы являются объектами, но не все объекты являются конструкторами. Каждый конструктор обладает свойством Prototype, которое используется для реализации прототипного наследования и разделяемых свойств. Объекты создаются путём использования конструкторов в выражениях new; например, new String("A String") создаёт новый объект String. Вызов конструктора без использования new имеет последствия, зависящие от конструктора. Например, String("A String") создаёт элементарную строку, а не объект.
ECMAScript поддерживает прототипное наследование (или, иначе говоря, "наследование на прототипах" - прим. ред.). Каждый конструктор обладает соответствующим прототипом, и каждый объект, созданный этим конструктором содержит неявную ссылку на прототип (называемый прототипом объекта), связанный с данным конструктором. Более того, прототип может обладать имеющей не пустое (отличное от null) значение неявной ссылки на свой прототип, и т.д.; это называется иерархией прототипов. Когда используется ссылка на свойство объекта, то на самом деле используется ссылка на свойство с таким именем у первого объекта в иерархии прототипов, который содержит свойство с таким именем. Другими словами, сначала такое свойство ищется непосредственно в указанном объекте. Если объект обладает свойством с этим именем, то ссылка указывает на него. Если этот объект не содержит указанного свойства, оно ищется в прототипе этого объекта, и так далее.
В объектно-ориентированных языках, использующих классы, в общем случае состояние заключено в экземплярах класса, а наследуется только структура и поведение. В ECMAScript состояние и методы заключаются в объектах, а структура, поведение и состояние наследуются.
Все объекты, которые прямо не содержат некоторое свойство, которое содержит их прототип, разделяют это свойство и его значение. Это можно проиллюстрировать следующей диаграммой:
CF - конструктор (который также является объектом). Пять объектов было создано с использованием выражения new: cf1, cf2, cf3, cf4 и cf5. Каждый из этих объектов содержит свойства с именами q1 и q2. Пунктирная линия представляет отношение неявного прототипа; таким образом, например, прототипом cf3 является CFp. Конструктор CF сам обладает двумя свойствами с именами P1 и P2, которые не видны CFp, cf1, cf2, cf3, cf4 и cf5. Свойство CFP1 в CFp разделяют cf1, cf2, cf3, cf4 и cf5 (но не CF), аналогично и другие свойства, находящиеся в неявной иерархии прототипов CFp, имеющие имена, отличные от q1, q2 и CFP1. Заметим, что между CF и CFp нет неявной прототипной связи.
В отличие от объектных языков, использующих классы, свойства могут быть добавлены к объектам динамически путём присвоения им значений. Таким образом, конструкторы не обязаны указывать имена или присваивать значения всем свойствам создаваемого объекта. Для вышеприведённой диаграммы можно добавить новое разделяемое свойство для cf1, cf2, cf3, cf4 и cf5 путём присвоения нового значения свойству CFp.
- 4.3 Определения
-
Далее следуют неформальные определения ключевых терминов, связанных с ECMAScript.
- 4.3.1 Тип
-
Тип - набор значений данных.
- 4.3.2 Элементарное значение
-
Элементарное значение - значение одного из типов Undefined, Null, Boolean, Number или String. Элементарное значение - единица данных, представляемая напрямую на самом нижнем уровне реализации языка.
- 4.3.3 Объект
-
Объект - элемент типа Object. Представляет собой неупорядоченный набор свойств, каждое из которых содержит элементарное значение, объект или функцию. Функция, хранимая в свойстве объекта, называется методом.
- 4.3.4 Конструктор
-
Конструктор - объект типа Function, который создаёт и инициализирует объекты. Каждый конструктор обладает соответствующим объектом-прототипом, который используется для реализации наследования и разделяемых свойств.
- 4.3.5 Прототип
-
Прототип - объект, используемый для реализации наследования структуры, состояния и поведения в ECMAScript. Когда конструктор создаёт объект, этот объект неявно ссылается на соответствующий этому конструктору прототип, чтобы использовать его для разрешения ссылок на свойства. Связанный с конструктором прототип доступен через выражение constructor.prototype, а свойства, добавляемые к прототипу объекта разделяются, посредством наследования, всеми объектами, разделяющими прототип.
- 4.3.6 Родные объекты
-
Родной (прим. перев. native) объект - любой объект, предоставляемый средой ECMAScript независимо от внешней среды. Стандартные родные объекты определены в данной спецификации. Некоторые из родных объектов создаются автоматически, другие могут быть созданы в ходе выполнения программы на ECMAScript.
- 4.3.7 Встроенный объект
-
Встроенный (прим. перев. built-in) объект - любой объект, предоставляемый реализацией ECMAScript вне зависимости от внешней среды, который существует в момент начала выполнения программы на ECMAScript. Стандартные встроенные объекты ECMAScript определены в данной спецификации, и каждая реализация ECMAScript может определять свои собственные. Каждый встроенный объект является родным.
- 4.3.8 Объект среды
-
Объект среды - любой объект, предоставленный внешней средой для дополнения среды выполнения ECMAScript. Любой объект, не являющийся встроенным, является объектом среды.
- 4.3.9 Неопределённое значение
-
Неопределённое (undefined) значение - элементарное значение, используемое, когда переменной ещё не было присвоено значение.
- 4.3.10 Неопределённый тип
-
Тип Undefined имеет в точности одно значение, называемое undefined.
- 4.3.11 Пустое значение
-
Пустое (null) значение - элементарное значение, которое обозначает пустую или отсутствующую ссылку.
- 4.3.12 Тип Null
-
Тип Null имеет в точности одно значение, называемое null.
- 4.3.13 Булевское значение
-
Булевское значение - один из двух уникальных элементов типа Boolean: true (истина) или false (ложь).
- 4.3.14 Тип Boolean
-
Тип Boolean представляет собой логическую сущность и содержит в точности два уникальных значения. Первое называется true, а второе - false.
- 4.3.15 Объект Boolean
-
Объект Boolean - элемент типа Object, который также является экземпляром встроенного объекта Boolean. Объект типа Boolean создаётся при помощи конструктора Boolean в составе выражения new, которому в качестве аргумента передаётся булевское значение. Результирующий объект обладает неявным (безымянным) свойством, содержащим это булевское значение. Объект типа Boolean может быть приведён к булевскому значению.
- 4.3.16 Строковое значение
-
Строковое значение - элемент типа String, представляющий собой конечную упорядоченную последовательность нуля или более 16-битных беззнаковых целых значений.
ЗАМЕЧАНИЕ Хотя каждое значение обычно представляет один 16-битный элемент текста в UTF-16, язык не накладывает никаких ограничений или требований к значениям, кроме того, что они должны являться 16-битными беззнаковыми целыми.
- 4.3.17 Тип String
-
Тип String представляет собой множество всех строковых значений.
- 4.3.18 Объект String
-
Объект String является элементом типа Object и экземпляром встроенного объекта String. Объект типа String создаётся при помощи конструктора String в составе выражения new, которому в качестве аргумента передаётся строковое значение. Результирующий объект обладает неявным (безымянным) свойством, содержащим это строковое значение. Объект типа String может быть приведён к строковому значению путём вызова конструктора String как функции (15.5.1).
- 4.3.19 Числовое значение
-
Числовое значение имеет тип Number, который является прямым представлением числа.
- 4.3.20 Тип Number
-
Тип Number - множество значений, представляющих числа. В ECMAScript множество значений представляет значения 64-битного формата чисел с двойной точностью IEEE 754, включая специальные значения "не-число" (NaN), положительную бесконечность и отрицательную бесконечность.
- 4.3.21 Объект Number
-
Объект Number(числовой объект) имеет тип Object и является экземпляром встроенного объекта Number . То есть, числовой объект создается при помощи конструктора Number директивой new, при этом в качестве аргумента конструктора передаётся число. Результирующий объект обладает неявным (безымянным) свойством, содержащим это численное значение. Объект типа Number может быть приведён к числовому значению путём вызова конструктора Number как функции (15.7.1).
- 4.3.22 Бесконечность
-
Элементарное значение Infinity представляет положительное бесконечное численное значение. Это значение имеет тип Number.
- 4.3.23 NaN
-
Элементарное значение NaN представляет набор значений "не число" стандарта IEEE. Это значение имеет тип Number.
|
голову поломать можно, написано как то сложно! напомнило школьные учебники
Обычная документация, тем более это стандарт, а не язык программирования. если комуто не понятно - это ваши проблемы, автор перевода не виноват в вашей тупости. а от меня огромно спасибо! Пишу на серверном языке стандарта ECMAScript. Ваши статьи помогают.
Чтобы понимать техническую документацию, нужно уметь ее читать
Спорим, что те кто гнал на автора, даже высшее получить не смогли?
Кстати забыл добавить, что я начинал читать этот стандарт в оригинале, не намного сложнее для понимания, даже с плохим знанием английского крайне редко прибегал к использованию переводчика, так что господа, не демонстрируйте свою глупость.
А мне более понятно чем учебники...
если что это спецификация на сколько я знаю они пишутся исключительно по ISO(ГОСТ) поэтому вины автора здесь нет.
Описание стандарта из RFC, это нормально. Зачем ругаться?
хороший перевод, причем написано грамотно. Хорошая спецификация
Надо понимать, что если бы начинающим яваскриптерам нужен был стандарт, они бы пошли за ним на rfc, сюда же люди пришли за тем, чтоб прочитать и понять, а из данного текста у них это не вышло, мне тоже как человеку никогда не имевшему практики программирования тоже особо не понятно написанное и было бы лучше, если бы тут написали тоже самое, но доступными человеческими словами
Классное обьяснение. Мне например, как пришедшему с С и С++ многое стало ясно, почему язык такой... "странный". А главное понимание того что такое скриптовый язык.
Что скажу, не хочу поддерживать срачь, но от себя добавлю как самоучка высшего не имею, являюсь фрилансером. Документация настолько простая что я не понимаю что-тут не понятно? Единственное что я перечитал это "Все объекты, которые прямо не содержат некоторое свойство, которое содержит их прототип, разделяют это свойство и его значение. Это можно проиллюстрировать следующей диаграммой:" только тут прочитал дважды, за статью спасибо.