256
http://javascript.ru/ecma[14.03.09 12:52:12] Javascript.ru представляет ;) Стандарт ECMA-262, 3 редакция Версия документа от 03.2009 Постоянная ссылка: http://javascript.ru/ecma Краткая история Этот стандарт ECMA основан на нескольких технологиях, самые известные из которых - JavaScript (Netscape) и JScript (Microsoft). Язык был изобретен Brendan Eich в Netscape и впервые появился в браузере этой компании Navigator 2. В дальнейшем он присутствовал во всех браузерах от Netscape и всех - от Microsoft, начиная с Internet Explorer 3.0, и так - до наших дней. Разработка этого стандарта началась в ноябре 1996г. Первая редакция стандарта ECMA была принята общим собранием ECMA в июне 1997г. Стандарт ECMA был отослан в ISO/IEC JTC 1 для быстрого согласования и одобрен как международный стандарт ISO/IEC 16262 в апреле 1998г. В июне 1998 года общее собрание ECMA одобрило вторую редакцию ECMA-262, чтобы поддерживать соответствие с ISO/IEC 16262. Изменения между первой и второй редакцией - по сути редакторские правки. Настоящий документ описывает третью редакцию стандарта и включает в себя мощные регулярные выражения, улучшенную поддержку строк, новые управляющие конструкции, обработку исключений try/catch, конкретизированное определение ошибок, форматирование при численном выводе и небольшие изменения для приближающейся интернационализации и будущего роста языка. Работа над языком не завершена. Технический комитет работает над значительными улучшениями, включая механизмы для создания и использования скриптов в интернет и улучшенную координацию с другими разработчиками стандартов, такими как группы в консорциуме W3C и Wireless Application Protocol Forum. Этот стандарт был принят как 3-я редакция ECMA-262 общим собранием ECMA в декабре 1999 года. Прим. ред. - несмотря на такую давность принятия стандарта, он медленно прокладывал путь в браузеры. Сейчас ему соответствует javascript версии 1.5. Javascript версии 1.6 и выше существует, он расширяет версию 1.5 и поддерживается только браузерами от Mozilla. Другие браузеры, включая Internet Explorer, Opera и сравнительно недавно появившийся

Стандарт ECMA-262, 3 редакция

Embed Size (px)

Citation preview

Page 1: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Javascript.ruпредставляет ;)

Стандарт ECMA-262, 3 редакцияВерсия документа от 03.2009Постоянная ссылка: http://javascript.ru/ecma

Краткая историяЭтот стандарт ECMA основан на нескольких технологиях, самые известные из которых -JavaScript (Netscape) и JScript (Microsoft). Язык был изобретен Brendan Eich в Netscape ивпервые появился в браузере этой компании Navigator 2. В дальнейшем он присутствовал вовсех браузерах от Netscape и всех - от Microsoft, начиная с Internet Explorer 3.0, и так - донаших дней.

Разработка этого стандарта началась в ноябре 1996г. Первая редакция стандарта ECMA былапринята общим собранием ECMA в июне 1997г.

Стандарт ECMA был отослан в ISO/IEC JTC 1 для быстрого согласования и одобрен какмеждународный стандарт ISO/IEC 16262 в апреле 1998г. В июне 1998 года общее собраниеECMA одобрило вторую редакцию ECMA-262, чтобы поддерживать соответствие с ISO/IEC16262. Изменения между первой и второй редакцией - по сути редакторские правки.

Настоящий документ описывает третью редакцию стандарта и включает в себя мощныерегулярные выражения, улучшенную поддержку строк, новые управляющие конструкции,обработку исключений try/catch, конкретизированное определение ошибок, форматированиепри численном выводе и небольшие изменения для приближающейся интернационализации ибудущего роста языка.

Работа над языком не завершена. Технический комитет работает над значительнымиулучшениями, включая механизмы для создания и использования скриптов в интернет иулучшенную координацию с другими разработчиками стандартов, такими как группы вконсорциуме W3C и Wireless Application Protocol Forum.

Этот стандарт был принят как 3-я редакция ECMA-262 общим собранием ECMA в декабре1999 года.

Прим. ред. - несмотря на такую давность принятия стандарта, он медленно прокладывал путьв браузеры. Сейчас ему соответствует javascript версии 1.5. Javascript версии 1.6 и вышесуществует, он расширяет версию 1.5 и поддерживается только браузерами от Mozilla. Другие браузеры, включая Internet Explorer, Opera и сравнительно недавно появившийся

Page 2: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Google Chrome, поддерживают именно этот (который вы читаете) стандарт яваскрипт.

март 2009Илья Кантор, javascript.ru.

Спецификация ECMA. Содержание1. Сфера применения2. Соответствие3. Ссылки4. Общее описание

4.1 Скрипты для Web4.2 Общее описание языка

4.2.1 Объекты4.3 Определения

4.3.1 Тип4.3.2 Примитивное значение4.3.3 Объект4.3.4 Конструктор4.3.5 Прототип4.3.6 Нативные объекты4.3.7 Встроенный объект4.3.8 Объект среды4.3.9 Неопределённое значение4.3.10 Неопределённый тип4.3.11 Пустое значение4.3.12 Тип Null4.3.13 Булевское значение4.3.14 Тип Boolean4.3.15 Объект Boolean4.3.16 Строковое значение4.3.17 Тип String4.3.18 Объект String4.3.19 Численное значение4.3.20 Тип Number4.3.21 Объект Number4.3.22 Бесконечность4.3.23 NaN

5. Соглашения о наименованиях5.1 Синтаксические и лексические грамматики

5.1.1 Контекстно-свободные грамматики5.1.2 Лексические и регулярные грамматики5.1.3 Численная строковая грамматика5.1.4 Синтаксическая грамматика5.1.5 Нотация грамматики

5.2 Соглашения по алгоритмам6. Исходный текст7. Лексические соглашения

7.1 Символы форматирования Юникода7.2 Пробел

Page 3: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7.3 Разделители строк7.4 Комментарии7.5 Токены

7.5.1 Зарезервированные слова7.5.2 Ключевые слова7.5.3 Слова, зарезервированные для будущего использования

7.6 Идентификатор7.7 Знаки препинания7.8 Литералы

7.8.1 Литералы Null7.8.2 Булевские литералы7.8.3 Числовые литералы7.8.4 Строковые литералы7.8.5 Литералы регулярных выражений

7.9 Автоматическая вставка точек с запятыми7.9.1 Правила автоматической вставки точек с запятыми7.9.2 Примеры автоматической вставки точек с запятой

8. Типы8.1 Тип Undefined8.2 Тип Null8.3 Тип Boolean8.4 Тип String8.5 Тип Number8.6 Тип Object

8.6.1 Атрибуты свойства8.6.2 Внутренние свойства и методы

8.7 Тип Reference8.7.1 ПолучитьЗначение(V)8.7.2 ЗаписатьЗначение(V, W)

8.8 Тип List8.9 Тип Completion

9. Преобразование типов9.1 ToPrimitive9.2 ToBoolean9.3 ToNumber

9.3.1 ToNumber применённый к типу String9.4 ToInteger9.5 ToInt32: (Знаковое 32-разрядное целое)9.6 ToUint32: (Беззнаковое 32-разрядное целое)9.7 ToUint16: (Беззнаковое 16-разрядное целое)9.8 ToString

9.8.1 ToString применённый к типу Number9.9 ToObject

10. Контексты исполнения10.1 Определения

10.1.1 Объекты типа Function10.1.2 Типы исполняемого кода10.1.3 Инициализация переменных10.1.4 Иерархия областей видимости и разрешение идентификаторов10.1.5 Глобальный объект10.1.6 Объект активации

Page 4: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

10.1.7 This10.1.8 Объект аргументов

10.2 Вход в контекст исполнения10.2.1 Глобальный код10.2.2 Eval-код10.2.3 Код функции

11. Выражения11.1 Первичные выражения

11.1.1 Ключевое слово this11.1.2 Ссылка на идентификатор11.1.3 Ссылка на литерал11.1.4 Инициализатор массива11.1.5 Инициализатор объекта11.1.6 Оператор группировки

11.2 Левосторонние выражения11.2.1 Доступ к свойствам11.2.2 Оператор new11.2.3 Вызовы функций11.2.4 Списки аргументов11.2.5 Выражения функций

11.3 Постфиксные выражения11.3.1 Постфиксный оператор инкремента11.3.2 Постфиксный оператор декремента

11.4 Унарные операторы11.4.1 Оператор delete11.4.2 Оператор void11.4.3 Оператор typeof11.4.4 Префиксный оператор инкремента11.4.5 Префиксный оператор декремента11.4.6 Унарный оператор +11.4.7 Унарный оператор -11.4.8 Побитовый оператор НЕ ( ~ )11.4.9 Логический оператор НЕ ( ! )

11.5 Мультипликативные операторы11.5.1 Действие оператора *11.5.2 Действие оператора /11.5.3 Действие оператора %

11.6 Синтаксис аддитивных операторов11.6.1 Оператор сложения ( + )11.6.2 Оператор вычитания ( - )11.6.3 Действие аддитивных операторов ( +, - ) в применении к объектам типаNumber

11.7 Операторы побитового сдвига11.7.1 Оператор сдвига влево ( << )11.7.2 Оператор знакового сдвига вправо ( >> )11.7.3 Оператор беззнакового сдвига вправо ( >>> )

11.8 Операторы отношения11.8.1 Оператор меньше-чем ( < )11.8.2 Оператор больше-чем ( > )11.8.3 Оператор меньше или равно ( <= )11.8.4 Оператор больше-или-равно ( >= )

Page 5: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

11.8.5 Абстрактный алгоритм сравнения для отношений11.8.6 Оператор instanceof11.8.7 Оператор in

11.9 Операторы равенства11.9.1 Оператор равенства ( == )11.9.2 Оператор не-равно ( != )11.9.3 Абстрактный алгоритм сравнения для равенств11.9.4 Оператор строгого равенства ( === )11.9.5 Оператор строгого неравенства ( !== )11.9.6 Алгоритм сравнения строгого равенства

11.10 Двоичные побитовые операторы11.11 Бинарные логичесие операторы11.12 Условный оператор ( ?: )11.13 Операторы присваивания

11.13.1 Простое присваивание ( = )11.13.2 Составное присваивание ( op= )

11.14 Оператор-запятая ( , )12. Инструкции

12.1 Блок12.2 Выражение переменной12.3 Пустая инструкция12.4 Инструкция-выражение12.5 Инструкция if12.6 Инструкции итерации12.6.1 Инструкция do-while12.6.2 Инструкция while12.6.3 Инструкция for12.6.4 Инструкция for-in12.7 Инструкция continue12.8 Инструкция break12.9 Инструкция return12.10 Инструкция with12.11 Инструкция switch12.12 Инструкции с метками12.13 Инструкция throw12.14 Инструкция try

13. Определение функции13.1 Определения

13.1.1 Тождественные правила грамматики13.1.2 Объединённые объекты

13.2 Создание объектов типа Function13.2.1 [[Call]]13.2.2 [[Construct]]

14. Программа15. Нативные объекты ECMAScript

15.1 Глобальный объект15.1.1 Свойства-значения глобального объекта15.1.2 Свойства-функции глобального объекта15.1.3 Свойства-функции для обработки URI15.1.4 Свойства-конструкторы глобального объекта15.1.5 Другие свойства глобального объекта

Page 6: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.2 Объекты Object15.2.1 Вызов конструктора Object как функции15.2.2 Конструктор Object15.2.3 Свойства конструктора Object15.2.4 Свойства объекта-прототипа Object15.2.5 Свойства экземпляров Object

15.3 Объекты типа Function15.3.1 Вызов конструктора Function как функции15.3.2 Конструктор Function15.3.3 Свойства конструктора Function15.3.4 Свойства объекта-прототипа Function15.3.5 Свойства экземпляров Function

15.4 Объекты Array15.4.1 Вызов конструктора Array как функции15.4.2 Конструктор Array15.4.3 Свойства конструктора Array15.2.4 Свойства объекта-прототипа Array15.4.5 Свойства экземпляров Array

15.5 Объекты типа String15.5.1 Вызов конструктора String как функции15.5.2 Конструктор String15.5.3 Свойства конструктора String15.5.4 Свойства объекта-прототипа String15.5.5 Свойства экземпляров String

15.6 Объекты типа Boolean15.6.1 Вызов конструктора Boolean как функции15.6.2 Конструктор Boolean15.6.3 Свойства конструктора Boolean15.6.4 Свойства объекта-прототипа Boolean15.6.5 Свойства экземпляров Boolean

15.7 Объекты типа Number15.7.1 Вызов конструктора Number как функции15.7.2 Конструктор Number15.7.3 Свойства конструктора Number15.7.4 Свойства объекта-прототипа Number15.7.5 Свойства экземпляров Number

15.8 Объект Math15.8.1 Свойства-значения объекта Math15.8.2 Свойства-функции объекта Math

15.9 Объекты типа Date15.9.1 Общие сведения об объектах типа Date и определения внутреннихоператоров15.9.2 Вызов конструктора Date как функции15.9.3 Конструктор Date15.9.4 Свойства конструктора Object15.9.5 Свойства объекта-прототипа Date15.9.6 Свойства экземпляров Date

15.10 Объекты типа RegExp (регулярные выражения)15.10.1 Шаблоны15.10.2 Семантика шаблонов15.10.3 Вызов конструктора RegExp как функции

Page 7: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.10.4 Конструктор RegExp15.10.5 Свойства конструктора RegExp15.10.6 Свойства объекта-прототипа RegExp15.10.7 Свойства экземпляров RegExp

15.11 Объекты Error15.11.1 Вызов конструктора Error как функции15.11.2 Конструктор Error15.11.3 Свойства конструктора Error15.11.4 Свойства объекта-прототипа Error15.11.5 Свойства экземпляров Error15.11.6 Встроенные типы ошибок, использованные в данном стандарте15.11.7 Структура объекта типа NativeError

16. ОшибкиПриложение A - Описание грамматикПриложение B - Совместимость

Дополнительно: Глоссарий англоязычных терминов.

Сфера применения1. Сфера применения

Этот Стандарт определяет скриптовый язык ECMAScript.

Cоответствие стандарту2. Соответствие стандарту

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

Соответствующей стандарту реализации этого международного стандарта следуетинтерпретировать символы в соответствии с Unicode Standard, версия 2.1 или болеепоздняя, и ISO/IEC 10646-1 с UCS-2 или UTF-16 в качестве принятой формыкодирования, 3й уровень реализации. Если принятое подмножество ISO/IEC 10646-1 неуказано явно, предполагается, что это подмножество BMP, коллекция 300. Если принятаяформа кодирования не указана явна, предполагается, что это UTF-16.

Соответствующая стандарту реализация ECMAScript может предоставлятьдополнительные типы данных, значения, объекты, свойства и функции, кроме описанныхв этой спецификации. В частности, соответствующая реализация ECMAScript можетпредоставлять свойства, не описанные в этой спецификации, и значения для этих свойствдля объектов, описанных в спецификации.

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

Page 8: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

перечисленные в п.7.5.3 этой спецификации.

Ссылки3. Ссылки

ISO/IEC 9899: 1996 Programming Languages - C, including amendment 1 and technicalcorrigenda 1 and 2.

ISO/IEC 10646-1: 1993 Information Technology --Universal Multiple-Octet Coded CharacterSet (UCS) plus its amendments and corrigenda.

Unicode Inc. (1996), The Unicode Standard , Version 2.0. ISBN: 0-201-48345-9, Addison-Wesley Publishing Co., Menlo Park, California.

Unicode Inc. (1998), Unicode Technical Report #8: The Unicode Standard , Version 2.1.

Unicode Inc. (1998), Unicode Technical Report #15: Unicode Normalization Forms.

ANSI/IEEE Std 754-1985: IEEE Standard for Binary Floating-Point Arithmetic. Institute ofElectrical and Electronic Engineers, New York (1985).

Общий обзор4. Общее описание

Данный раздел не является нормативным и содержит общее описание языка ECMAScript.

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

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

Page 9: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

Некоторые из средств ECMAScript являются аналогичными тем, которые используются вдругих языках программирования, в частности Java и Self. Описания этих языков можнонайти в следующих книгах:

Gosling, James, Bill Joy and Guy Steele. The Java™ Language Specification. AddisonWesley Publishing Co., 1996.Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87Conference Proceedings, pp. 227-241, Orlando, FL, October 1987.

4.1 Скрипты для веба

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

Веб-сервер предоставляет другую среду выполнения для серверных вычислений,включающую объекты, представляющие запросы, клиенты и файлы, и механизмы дляблокировки и разделения данных. Путём совместного использования браузерных иклиентских скриптов становится возможным распределить вычисления между клиентоми сервером, в то же время реализуя сложный интерфейс веб-приложения.

Каждый веб-браузер и сервер, который поддерживает ECMAScript, предоставляет своюсобственную среду, дополняя среду выполнения ECMAScript.

4.2 Общее описание языка

Далее следует неформальное описание языка ECMAScript - описываются не все частиязыка. Это общее описание не является частью собственно стандарта.

ECMAScript является объектным языком: базовый язык и средства среды предоставлены ввиде объектов, и программа на ECMAScript представляет совокупность общающихсяобъектов. Объект ECMAScript представляет собой неупорядоченный набор свойств,каждое из которых обладает нулём или более атрибутов, которые определяют, какможет использоваться каждое из свойств (например, когда атрибут ReadOnly установленв true, любая попытка выполняемого кода на ECMAScript изменить значение этогосвойства не возымеет результата. Свойства являются контейнерами, содержащими другиеобъекты, примитивные значения или методы. Примитивное значение - значение,

Page 10: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

имеющее один из следующих встроенных типов: 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 состояние и методы заключаются в объектах, а структура, поведение и

Page 11: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

состояние наследуются.

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

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. Примитивное значение - единица данных, представляемая напрямую на

Page 12: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

4.3.3 Объект

Объект - элемент типа Object. Представляет собой неупорядоченный набор свойств,каждое из которых содержит примитивное значение, объект или функцию. Функция,хранимая в свойстве объекта, называется методом.

4.3.4 Конструктор

Конструктор - объект типа Function, который создаёт и инициализирует объекты.Каждый конструктор обладает соответствующим объектом-прототипом, которыйиспользуется для реализации наследования и разделяемых свойств.

4.3.5 Прототип

Прототип - объект, используемый для реализации наследования структуры, состояния иповедения в ECMAScript. Когда конструктор создаёт объект, этот объект неявноссылается на соответствующий этому конструктору прототип, чтобы использовать егодля разрешения ссылок на свойства. Связанный с конструктором прототип доступенчерез выражение constructor.prototype, а свойства, добавляемые к прототипу объектаразделяются, посредством наследования, всеми объектами, разделяющими прототип.

4.3.6 Нативные объекты

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

4.3.7 Встроенный объект

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

4.3.8 Объект среды

Объект среды - любой объект, предоставленный внешней средой для дополнения средывыполнения ECMAScript. Любой объект, не являющийся нативным, является объектомсреды.

4.3.9 Неопределённое значение

Неопределённое (undefined) значение - примитивное значение, используемое, когдапеременной ещё не было присвоено значение.

4.3.10 Неопределённый тип

Тип Undefined имеет в точности одно значение, называемое undefined.

Page 13: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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, который является прямым представлением

Page 14: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

числа.

4.3.20 Тип Number

Тип Number - множество значений, представляющих числа. В ECMAScript множествозначений представляет значения 64-битного формата чисел с двойной точностью IEEE754, включая специальные значения "не-число" (NaN), положительную бесконечность иотрицательную бесконечность.

4.3.21 Объект Number

Объект Number - элемент типа Object, который также является экземпляром встроенногообъекта Number. Объект типа Number создаётся при помощи конструктора Number всоставе выражения new, которому в качестве аргумента передаётся число.Результирующий объект обладает неявным (безымянным) свойством, содержащим эточисленное значение. Объект типа Number может быть приведён к строковому значениюпутём вызова конструктора Number как функции (15.7.1).

4.3.22 Бесконечность

Примитивное значение Infinity представляет положительное бесконечное численноезначение. Это значение является элементом типа Number.

4.3.23 NaN

Примитивное значение NaN представляет набор значений "не число" стандарта IEEE. Этозначение является элементом типа Number.

Соглашения о наименованиях5. Соглашения о наименованиях5.1 Синтаксические и лексические грамматики

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

5.1.1 Контекстно-свободные грамматики

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

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

Page 15: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

5.1.2 Лексическая и РегВыр грамматики

Лексическая грамматика для ECMAScript приведена в разделе 7. Терминальными в этойграмматике являются символы Юникода. Она содержит набор правил, начинающийся сначального символа ВходнойЭлементДеления или ВходнойЭлементРегВыр,определяющий способ преобразования последовательности символов Юникода впоследовательность входных элементов.

Входные элементы, отличные от пробелов и комментариев, образуют терминалысинтаксической грамматики ECMAScript и называются токенами ECMAScript. К токенамотносятся ключевые слова, идентификаторы, литералы и знаки пунктуации языкаECMAScript. Более того, символы окончания строк, хотя и не считаются токенами, тожестановятся частью потока входных элементов и руководят процессом автоматическойподстановки точек с запятой (7.9). Простые пробелы и однострочные комментарииигнорируются и не появляются в потоке входных элементов для синтаксическойграмматики. МногострочныйКомментарий (то есть комментарий вида "/* --- */", внезависимости от того, занимает ли он в действительности одну или несколько строк)аналогичным образом игнорируется, если в нём не содержится переводов строк; однакоесли МногострочныйКомментарий содержит один или более символов окончания строки,то он заменяется на единственный перевод строки, который становится частью потокавходных элементов синтаксической грамматики.

РегВыр-грамматика для ECMAScript приведена в разделе 15.10. Символы Юникодаявляются терминальными также и в этой грамматике. Она содержит набор правил,начинающийся с начального символа Шаблон, определяющий способ преобразованияпоследовательностей символов Юникода в шаблоны регулярных выражений.

Правила лексических и РегВыр-грамматик описываются с использованием двойногодвоеточия ("::") в качестве разделительного знака. Некоторые правила являются общимидля лексических и РегВыр-грамматик.

5.1.3 Численная строковая грамматика

Следующая грамматика используется для перевода строк в числовые значения. Онаявляется аналогичной той части лексической грамматики, которая описывает численныелитералы, и её терминалами являются символы Юникода. Эта грамматика описывается вразделе 9.3.1.

Правила численной строковой грамматики описываются с использованием тройногодвоеточия (":::") в качестве разделительного знака.

5.1.4 Синтаксическая грамматика

Синтаксическая грамматика для ECMAScript приведена в разделах 11, 12, 13 и 14. В этойграмматике терминалами являются токены ECMAScript, определенные в лексическойграмматике (5.1.2). Она содержит набор правил, начинающийся с начального символаПрограмма, определяющий способ преобразования последовательностей токенов всинтаксически корректные программы на ECMAScript.

Когда поток символов Юникода распознается в качестве программы на ECMAScript, онпредварительно преобразуется в поток входных элементов путём рекурсивногоприменения правил лексической грамматики. Затем этот поток входных элементов

Page 16: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

Правила численной строковой грамматики описываются с использованием одиночногодвоеточия (":") в качестве разделительного знака. Синтаксическая грамматика, описаннаяв разделах 0, 0, 0 и 0, на самом деле не является исчерпывающим определением того,какие последовательности токенов принимаются в качестве корректных программ наECMAScript. Приемлемыми являются также некоторые дополнительныепоследовательности токенов, а именно те, которые описывались бы грамматикой, еслибы символы "точка с запятой" были добавлены в последовательность в некоторых местах(например перед символами перевода строк). Кроме того, некоторыепоследовательности токенов считаются неприемлемыми, если символ окончания строкивстречается в определённых "неудобных" местах.

5.1.5 Нотация грамматики

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

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

ИнструкцияWith :with ( Выражение ) Инструкция

гласит, что нетерминал ИнструкцияWith представляет токен with, за которым следуеттокен "левая скобка", Выражение и токен "правая скобка", за которыми, в свою очередь,идет Инструкция. Здесь элементы Выражение и Инструкция сами по себе являютсянетерминалами. В качестве другого примера приведём синтаксическое определение:

СписокАргументов :ВыражениеПрисваиванияСписокАргументов , ВыражениеПрисваивания

которое гласит, что СписокАргументов может представлять либо отдельноеВыражениеПрисваивания, либо последовательность из СпискаАргументов, запятой иВыраженияПрисваивания. Это определение СпискаАргументов является рекурсивным, тоесть в своем определении ссылается на само себя. В результате СписокАргументов можетсодержать любое положительное число аргументов, разделённых запятыми, гдевыражением для каждого аргумента является ВыражениеПрисваивания. Подобныерекурсивные определения нетерминалов весьма часто используются в описанияхформальных грамматик.

Page 17: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Набранный нижним индексом суффикс "опц", который может быть указан послетерминала или нетерминала, указывает на необязательный (опциональный) символ.Вариант, содержащий опциональный символ, в действительности описывает две правыечасти: не включающую опциональный символ и включающую его. Это означает, что:

ОбъявлениеПеременной :Идентификатор Инициализаторопц

является сокращённым для удобства вариантом полной записи:

ОбъявлениеПеременной :Идентификатор Идентификатор Инициализатор

и что:

ИнструкцияИтератор :for ( ВыражениеБезInопц ; Выражениеопц ; Выражениеопц ) Инструкция

является сокращённым для удобства вариантом полной записи:

ИнструкцияИтератор :for (; Выражениеопц ; Выражениеопц ) Инструкцияfor ( ВыражениеБезIn ; Выражениеопц ; Выражениеопц ) Инструкция

которая, в свою очередь, является сокращением для:

ИнструкцияИтератор :for (;; Выражениеопц ) Инструкцияfor (; Выражение ; Выражениеопц ) Инструкцияfor ( ВыражениеБезIn ;; Выражениеopt ) Инструкцияfor ( ВыражениеБезIn ; Выражение ; Выражениеопц ) Инструкция

которая, в свою очередь, является сокращением для:

ИнструкцияИтератор :for (;;) Инструкцияfor (;; Выражение ) Инструкцияfor (; Выражение ;) Инструкцияfor (; Выражение ; Выражение ) Инструкцияfor ( ВыражениеБезIn ;;) Инструкцияfor ( ВыражениеБезIn ;; Выражение ) Инструкцияfor ( ВыражениеБезIn ; Выражение ;) Инструкцияfor ( ВыражениеБезIn ; Выражение ; Выражение ) Инструкция

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

Если в качестве правой части правила указывается обозначение "[пусто]" - это значит, чтоправая часть правила не содержит терминалов или нетерминалов.

Page 18: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Если в правой стороне правила встречается обозначение "[предпросмотр множество]" -это значит, что правило не может быть использовано, если непосредственно затерминалом следует один из элементов указанного множества. Множество может бытьописано как список терминалов, заключённый в фигурные скобки. Для простотымножество также может описываться нетерминалом. В этом случае, оно представляетсобой множество всех терминалов, в которые может быть развернут указанныйнетерминал. Например, если уже имеются определения

ДесятичнаяЦифра :: одна из0 1 2 3 4 5 6 7 8 9

ДесятичныеЦифры ::ДесятичнаяЦифра ДесятичныеЦифры ДесятичнаяЦифра

то определение

ПримерПредпросмотра ::n [предпросмотр {1, 3, 5, 7, 9}] ДесятичныеЦифрыДесятичнаяЦифра [предпросмотр ДесятичнаяЦифра ]

описывает либо букву n, за которой следует одна или более десятичных цифр, первая изкоторых чётная, либо десятичная цифра, за которой не следует другая десятичнаяцифра.

Если обозначение "[здесь нет КонцаСтроки]" появляется в правой части правиласинтаксической грамматики, оно обозначает, что данное правило является ограниченнымправилом, т.е. не может быть использовано, если КонецСтроки встречается в данномместе входного потока. Например, правило:

ВыражениеReturn :return [здесь нет КонцаСтроки] Выражениеопц ;

означает, что данное правило не может быть использовано, если КонецСтрокивстречается в программе между токеном return и Выражением.

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

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

НенулеваяЦифра :: одна из1 2 3 4 5 6 7 8 9

которое просто является удобной сокращённой записью для:

НенулеваяЦифра

Page 19: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1 2 3 4 5 6 7 8 9

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

В определении правой части правила также может уточняться, что некоторые еётрактовки не являются допустимыми. На это указывают слова "но не", за которымиприводятся трактовки, подлежащие исключению. Например, правило:

Идентификатор ::ИмяИдентификатора но не КлючевоеСлово

означает, что нетерминал Идентификатор может быть заменён любойпоследовательностью символов, которая может заменить ИмяИдентификатора, кроме техпоследовательностей, которые также могут заменить КлючевоеСлово.

Наконец, в тех случаях, когда явно приводить все возможные варианты было бынецелесообразно, для некоторых нетерминальных символов приводится словесноеописание в обычном шрифте (Roman):

ИсходныйСимвол ::любой символ Юникода

5.2 Соглашения по алгоритмам

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

Когда алгоритм должен вернуть некоторое значение в качестве результата, директива"вернуть x" означает, что результатом алгоритма является значение x и что алгоритмдолжен остановиться в данной точке. Обозначение Результат(n) используется каксокращение для "результат шага n". Тип(x) используется как сокращение для "тип x".

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

Page 20: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

бесконечностей и знакового нуля. Если математическая операция или функцияприменяется к числу с плавающей запятой, её следует понимать как применённую кточному математическому значению, представленному этим числом. Такое число сплавающей запятой должно быть конечным, и если оно равняется +0 или -0, тосоответствующее математическое значение принимается просто за 0.

Математическая функция abs(x) возвращает модуль x, который равен -x, если xотрицателен (меньше нуля), и равен просто x в противном случае.

Математическая функция sign(x) возвращает 1 для положительного x и -1 дляотрицательного x. Функция sign не применяется в данном стандарте для случаев, когда xравен нулю.

Обозначение "x modulo y" (где y должно быть конечным и не равным нулю) вычисляетзначение k такого же знака, как и y (или ноль), такое, что abs(k)< abs(y) и x-k = q * yдля некоторого целого q.

Математическая функция floor(x) возвращает наибольшее целое (ближайшее к плюсбесконечности), которое не превосходит x.

ЗАМЕЧАНИЕfloor(x) = x-(x modulo 1).

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

Исходный текст6. Исходный текст

Исходный текст в ECMAScript представляется в виде последовательности символов вкодировке Юникод версии 2.1 или более поздней с использованием формататрансформации UTF-16. Текст должен быть нормализован к форме нормализации C(канонической композиции), описание которой приведено в приложении 15 к стандартуЮникода (UAX-15). От корректных реализаций ECMAScript не требуется проведениеникаких операций по нормализации текста и не требуется вести себя так, будто онипроизводят его нормализацию.

ИсходныйСимвол ::любой символ Unicode

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

Page 21: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

выражений и комментариях.

Далее по тексту документа словосочетание "кодовая точка" и слово "символ" будутиспользоваться для обозначения 16-разрядного беззнакового значения, используемогодля представления единичного элемента текста в кодировке UTF-16. Словосочетание"символ Юникода" будет использоваться для обозначения абстрактной лингвистическойили типографической единицы, представленной единичным числовым значениемЮникода (которое может быть длинее 16-ти бит и, таким образом, может бытьпредставлено более чем одной кодовой точкой). Это обозначение применяется только ксущностям, соответствующим одному числовому значению Юникода. Компонентыкомпозиций являются отдельными "символами Юникода", даже если с точки зренияпользователя вся композиция выглядит как один символ.

В строковых литералах, литералах регулярных выражений и идентификаторах любойсимвол (кодовая точка) может быть также представлен как юникодная escape-последовательность, состоящая из шести символов: комбинация \u и следующие за нейчетыре шестнадцатеричные цифры. В составе комментария такая escape-последовательность принимается за часть комментария и просто игнорируется. В составестрокового литерала или литерала регулярного выражения юникодная escape-последовательность трактуется как единичный символ литерала. В составеидентификатора escape-последовательность трактуется как единичный символидентификатора.

ЗАМЕЧАНИЕ 1 Хотя в данном документе иногда упоминается "преобразование" между "символомстроки" и 16-разрядным беззнаковым целым, являющимся кодом UTF-16 для этогосимвола, на самом деле никакого преобразования не производится, т.к. "символ строки"в действительности представляется при помощи этого 16-разрядного символа.

ЗАМЕЧАНИЕ 2 Язык ECMAScript отличается от языка программирования Java в области поведенияюникодных escape-последовательностей. В программе на Java, например, если escape-последовательность \u000A встречается в составе однострочного комментария, онатрактуется как символ окончания строки (символ Юникода 000A - "перевод строки"), и,таким образом, следующий за ней символ уже не считается частью комментария.Аналогично, если юникодная escape-последовательность \u000A встречается в строковомлитерале программы на Java, она тоже трактуется как символ конца строки, которыйнедопустим в строковом литерале (в Java, чтобы включить в строковой литерал символперевода строки, вместо \u000A следует писать \n). В программе на ECMAScriptюникодная escape-последовательность в составе комментария не подлежитрасшифровке и, таким образом, не может означать окончания комментария. Аналогично,юникодная escape-последовательность в составе строкового литерала в программе наECMAScript всегда трактуется как один из символов в значении строки и не может бытьрасшифрована как символ конца строки или символ кавычки, которые могут означатьокончание строкового литерала.

Лексические соглашения7. Лексические соглашения

Page 22: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Исходный текст программы на ECMAScript предварительно преобразуется впоследовательность входных элементов четырёх типов: токены, переводы строк,комментарии и пробелы. Исходный текст анализируется слева направо, последовательновыбирая наиболее длинную последовательность символов в качестве следующеговходного элемента.

В лексической грамматике определены два начальных символа. СимволВходнойЭлементДеления используется в тех контекстах синтаксической грамматики, гдеразрешено использование оператора деления (/) или деления-с-присваиванием (/=).Символ ВходнойЭлементРегВыр используется в прочих контекстах синтаксическойграмматики.

Заметим, что существуют такие контексты синтаксической грамматики, где разрешаетсяиспользование как операции деления, так и ЛитералаРегулярногоВыражения; однакопоскольку лексическая грамматика использует в таких случах начальный символВходнойЭлементДеления, открывающий слэш (/) в таком контексте не распознаётся какначало регулярного выражения. Чтобы обойти это ограничение, литерал регулярноговыражения можно заключить в скобки.

Синтаксис

ВходнойЭлементДеления ::Пробел КонецСтроки Комментарий Токен ЗнакДеления

ВходнойЭлементРегВыр ::Пробел КонецСтроки Комментарий Токен ЛитералРегулярногоВыражения

7.1 Символы форматирования Юникода

Символы управления форматом Юникода (например, символы категории "Cf" в базеданных символов Юникода, такие как LEFT-TO-RIGHT MARK и RIGHT-TO-LEFT MARK)являются управляющими кодами, используемыми для управления форматом текстовогофрагмента в отсутствии более высокоуровневых протоколов (таких как язык разметки),обычно применяемых для этой цели. Для облегчения редактирования и отображениятекста полезно разрешать включение таких символов в исходный текст.

Символы управления форматом могут встречаться где угодно в тексте программы наECMAScript. Эти символы удаляются из исходного текста перед применениемлексической грамматики. Поскольку такие символы удаляются перед обработкойстроковых литералов и литералов регулярных выражений, для включения символовформатирования следует использовать юникодную escape-последовательность (см. 7.6) .

7.2 Пробел

Page 23: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

Следующие символы считаются эквивалентными пробелу:

Код Юникода Наименование Формальноенаименование

\u0009 Табуляция <TAB>\u000B Вертикальная табуляция <VT>\u000C Перевод страницы <FF>\u0020 Пробел <SP>\u00A0 Неразрывный пробел <NBSP>Прочие в категории"Zs"

Прочие "разделители пробела" вЮникоде <USP>

Синтаксис

Пробел ::<TAB> <VT> <FF> <SP> <NBSP> <USP>

7.3 Разделители строк

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

Следующие символы считаются эквивалентными концу строки:

Код Юникода Наименование Формальное наименование\u000A Перевод строки <LF>\u000D Возврат каретки <CR>\u2028 Разделитель строк <LS>\u2029 Разделитель абзацев <PS>

Синтаксис

Page 24: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

КонецСтроки ::<LF> <CR> <LS> <PS>

7.4 Комментарии

Описание

Комментарии бывают двух типов: однострочные и многострочные. Многострочныекомментарии не могут быть вложенными.

Поскольку однострочный комментарий может содержать любой символ, кромеКонцаСтроки, и поскольку, согласно общему правилу, в качестве токена всегда берётсяпоследовательность символов наибольшей возможной длины, однострочныйкомментарий всегда включает в себя все символы от знака // до конца строки. Однако,КонецСтроки не считается частью однострочного комментария, учитывается лексическойграмматикой отдельно и становится частью потока входных символов длясинтаксической грамматики. Это замечание является очень важным, посколькуподразумевает, что наличие или отсутствие однострочных комментариев не влияет напроцесс автоматической вставки точек с запятой (7.9).

Комментарии ведут себя аналогично пробелам и обычно игнорируются. Исключениесоставляют те случаи, когда МногострочныйКомментарий содержит символ переводастроки. При этом с точки зрения синтаксической грамматики весь комментарийпринимается за КонецСтроки.

Синтаксис

Комментарий ::МногострочныйКомментарий ОднострочныйКомментарий

МногострочныйКомментарий ::/* СимволыМногострочногоКомментарияопц */

СимволыМногострочногоКомментария ::МногострочныйСимвНеЗвёздочка СимволыМногострочногоКомментарияопц* СимволыКомментарияПослеЗвёздочкиопц

СимволыКомментарияПослеЗвёздочки ::МногострочныйСимвНеСлэшИлиЗвёздочка СимволыМногострочногоКомментарияопц* СимволыКомментарияПослеЗвёздочкиопц

МногострочныйСимвНеЗвёздочка ::ИсходныйСимвол но не звёздочка *

МногострочныйСимвНеСлэшИлиЗвёздочка ::ИсходныйСимвол но не прямой слэш / или звёздочка *

ОднострочныйКомментарий ::

Page 25: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

// СимволыОднострочногоКомментарияопц

СимволыОднострочногоКомментария ::СимволОднострочногоКомментария СимволыОднострочногоКомментарияопц

СимволОднострочногоКомментария ::ИсходныйСимвол но не КонецСтроки

7.5 Токены

Синтаксис

Токен ::ЗарезервированноеСлово Идентификатор ЗнакПрепинанияЧисловойЛитерал СтроковойЛитерал

7.5.1 Зарезервированные слова

Описание

Зарезервированные слова не могут быть использованы в качестве идентификаторов.

Синтаксис

ЗарезервированноеСлово ::КлючевоеСловоЗарезервированноеНаБудущееСловоЛитералNull БулевскийЛитерал

7.5.2 Ключевые слова

Следующие токены являются ключевыми словами ECMAScript и не могут бытьиспользованы в программах на ECMAScript.

Синтаксис

КлючевоеСлово :: одно изbreak else new var case finally return void catch for switch while continue functionthis with default if throw delete in try do instanceof typeof

7.5.3 Слова, зарезервированные для будущего использования

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

Синтаксис

ЗарезервированноеНаБудущееСлово :: one of

Page 26: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

abstract enum int short boolean export interface static byte extends long super charfinal native synchronized class float package throws const goto private transientdebugger implements protected volatile double import public

7.6 Идентификаторы

Описание

Идентификаторы обрабатываются согласно грамматике, приведённой в разделе 5.16стандарта Юникода версии 3.0, с небольшими изменениями. Эта грамматикаосновывается на нормативных и информативных категориях символов, определённыхстандартом Юникода. Символы, принадлежащие к определённым категориям в версии2.1 стандарта Юникода должны обрабатываться как принадлежащие к этим категориямвсеми корректными реализациями ECMAScript. Однако корректные реализацииECMAScript также могут позволять использование в идентификаторах и других символов,основываясь на их категориальной принадлежности в более поздних версиях Юникода.

В данном стандарте имеется единственное отклонение от стандарта Юникода: знакдоллара ($) и подчёркивание (_) разрешены к использованию в любом местеидентификатора. Знак доллара предназначается только для использования вавтоматически генерируемом коде.

Юникодные escape-последовательности также разрешены к использованию видентификаторах и трактуются как одиночные символы в составе идентификаторасогласно СиЗ ЮникоднойEscapeПоследовательности (см. 7.8.4). Обратный слэш (\),предшествующий ЮникоднойEscapeПоследовательности, не трактуется как символидентификатора. При помощи ЮникоднойEscapeПоследовательности нельзя вставлять видентификаторы запрещённые символы. Другими словами, если заменить \ЮникоднуюEscapeПоследовательность на соответствующее ей СиЗ, результат по-прежнему должен являться корректным идентификатором, состоящим из тех жесимволов, что и первоначальный Идентификатор.

Два идентификатора, канонически эквивалентные согласно стандарту Юникода, неявляются одинаковыми, если они не представлены строго одинаковымипоследовательностями кодовых точек (иными словами, корректные реализацииECMAScript должны проводить только побитовое сравнение идентификаторов).Подразумевается, что входной текст был преобразован к нормализованной форме C ещёдо того, как был отправлен на вход компилятора.

Синтаксис

Идентификатор ::ИмяИдентификатора но не ЗарезервированноеСлово

ИмяИдентификатора ::НачалоИдентификатора НачалоИдентификатора ЧастьИдентификатора

НачалоИдентификатора ::БукваЮникода$_\ ЮникоднаяEscapeПоследовательность

Page 27: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ЧастьИдентификатора ::НачалоИдентификатора КомбинирующийЗнакЮникода ЦифраЮникода СоединяющаяПунктуацияЮникода \ ЮникоднаяEscapeПоследовательность

БукваЮникодалюбой символ из следующих категорий Юникода: "Прописная буква (Lu)", "Строчнаябуква (Ll)", "Заглавная буква (Lt)", "Буква-модификатор (Lm)", "Другая бугва (Lo)", or"Буква-число (Nl)".

КомбинирующийЗнакЮникодалюбой символ из следующих категорий Юникода: "Не-пробельный знак (Mn)" или"Комбинирующий пробельный знак (Mc)"

ЦифраЮникодалюбой символ из категории Юникода "Десятичное число (Nd)"

СоединяющаяПунктуацияЮникодалюбой символ из категории Юникода "Соединяющая пунктуация (Pc)"

ЮникоднаяEscapeПоследовательностьсм 7.8.4.

ШестнадцатеричнаяЦифра :: одна из0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

7.7 Знаки препинания

Синтаксис

ЗнакПрепинания :: один из{ } ( ) [ ] . ; , < > <= >= == != === !== +

Page 28: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

- * % ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *= %= <<= >>= >>>= &= |= ^=

ЗнакДеления :: один из/ /=

7.8 Литералы

Синтаксис

Литерал ::ЛитералNull БулевскийЛитерал ЧисловойЛитерал СтроковойЛитерал

7.8.1 Литералы Null

Синтаксис

ЛитералNull ::null

Семантика

Page 29: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значеним null-литерала null является единственное значение типа Null, а именно null.

7.8.2 Булевские литералы

Синтаксис

БулевскийЛитерал ::true false

Семантика

Значением булевского литерала true является значение типа Boolean, а именно true.

Значением булевского литерала false является значение типа Boolean, а именно false.

7.8.3 Числовые литералы

Синтаксис

ЧисловойЛитерал ::ДесятичныйЛитерал ШестнадцатеричныйЦелыйЛитерал

ДесятичныйЛитерал ::ДесятичныйЦелыйЛитерал . ДесятичныеЦифрыопц ЭкспоненциальнаяЧастьопц . ДесятичныеЦифры ЭкспоненциальнаяЧастьопц ДесятичныйЦелыйЛитерал ЭкспоненциальнаяЧастьопц

ДесятичныйЦелыйЛитерал ::0 НенулеваяЦифра ДесятичныеЦифрыопц

ДесятичныеЦифры ::ДесятичнаяЦифра ДесятичныеЦифры ДесятичнаяЦифра

ДесятичнаяЦифра :: одна из0 1 2 3 4 5 6 7 8 9

НенулеваяЦифра :: одна из1 2 3 4 5 6 7 8 9

ЭкспоненциальнаяЧасть ::ПризнакЭкспоЗаписи ЗнаковоеЦелое

ПризнакЭкспоЗаписи :: один изe E

ЗнаковоеЦелое ::ДесятичныеЦифры + ДесятичныеЦифры - ДесятичныеЦифры

Page 30: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ШестнадцатеричныйЦелыйЛитерал ::ШестнадцатеричнаяЦифра0x ШестнадцатеричнаяЦифра 0X ШестнадцатеричнаяЦифра ШестнадцатеричныйЦелыйЛитерал ШестнадцатеричнаяЦифра

Символ исходного текста, следующий непосредственно за ЧисловымЛитералом, недолжен являться НачаломИдентификатора или ДесятичнойЦифрой.

ЗАМЕЧАНИЕК примеру, запись

3in

является недопустимой, а не обозначением двух входных элементов: 3 и in.

Семантика

Числовой литерал обозначает значение типа Число. Его значение определяется в дваэтапа: сначала из литерала получается его математическое значение (МЗ), затем этоматематическое значение округляется по принципам, описанным ниже.

МЗ ЧисловогоЛитерала :: ДесятичногоЛитерала равняется МЗ ДесятичногоЛитерала.МЗ ЧисловогоЛитерала :: ШестнадцатеричногоЦелогоЛитерала равняется МЗШестнадцатеричногоЦелогоЛитерала.МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . равняется МЗДесятичногоЦелогоЛитерала.МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . ДесятичныхЦифрравняется МЗ ДесятичногоЦелогоЛитерала плюс (МЗ ДесятичныхЦифр, умноженноена 10 -n ), где n равно количеству символов в ДесятичныхЦифрах.МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . ЭкспоненциальнойЧастиравняется МЗ ДесятичногоЦелогоЛитерала, умноженному на 10 e , где e равняетсяМЗ ЭкспоненциальнойЧасти.МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . ДесятичныхЦифрЭкспоненциальнойЧасти равняется (МЗ ДесятичногоЦелогоЛитерала плюс (МЗДесятичныхЦифр, умноженное на 10-n )) умноженному на 10e, где n равно числусимволов в ДесятичныхЦифрах и e равно МЗ ЭкспоненциальнойЧасти.МЗ ДесятичногоЛитерала ::. ДесятичныхЦифр равняется МЗ ДесятичныхЦифр,умноженному на 10-n, где nравно числу символов в ДесятичныхЦифрах.МЗ ДесятичногоЛитерала :: . ДесятичныхЦифр ЭкспоненциальнойЧасти равняется МЗof ДесятичныхЦифр, умноженному на 10e-n,где n равно числу символов вДесятичныхЦифрах и e равно МЗ ЭкспоненциальнойЧасти.МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала равняется МЗДесятичногоЦелогоЛитерала.МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала ЭкспоненциальнойЧастиравняется МЗ ДесятичногоЦелогоЛитерала, умноженному на 10 e , где e равняетсяМЗ ЭкспоненциальнойЧасти.МЗ ДесятичногоЦелогоЛитерала :: 0 равняется 0.МЗ ДесятичногоЦелогоЛитерала :: НенулевойЦифры ДесятичныхЦифр равняется (МЗНенулевойЦифры умножить на 10n ) плюс МЗ of ДесятичныхЦифр, где n равночислу символов в ДесятичныхЦифрах.

Page 31: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

МЗ ДесятичныхЦифр :: ДесятичнойЦифры равняется МЗ ДесятичнойЦифры.МЗ ДесятичныхЦифр :: ДесятичныхЦифр ДесятичнойЦифры равняется (МЗДесятичныхЦифр умножить на 10) плюс МЗ ДесятичнойЦифры.МЗ ЭкспоненциальнойЧасти :: ПризнакаЭкспоненциальнойЗаписи ЗнаковогоЦелогоравняется МЗ ЗнаковогоЦелого.МЗ ЗнаковогоЦелого :: ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.МЗ ЗнаковогоЦелого :: + ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.МЗ ЗнаковогоЦелого :: - ДесятичныхЦифр равняется взятому с отрицательнымзнаком МЗ ДесятичныхЦифр.МЗ ДесятичнойЦифры :: 0 или ШестнадцатеричнойЦифры :: 0 равняется 0.МЗ ДесятичнойЦифры :: 1 или НенулевойЦифры :: 1 или ШестнадцатеричнойЦифры ::1 равняется 1. МЗ ДесятичнойЦифры :: 2 или НенулевойЦифры :: 2 илиШестнадцатеричнойЦифры :: 2 равняется 2.МЗ ДесятичнойЦифры :: 3 или НенулевойЦифры :: 3 или ШестнадцатеричнойЦифры ::3 равняется 3.МЗ ДесятичнойЦифры :: 4 или НенулевойЦифры :: 4 или ШестнадцатеричнойЦифры ::4 равняется 4.МЗ ДесятичнойЦифры :: 5 или НенулевойЦифры :: 5 или ШестнадцатеричнойЦифры ::5 равняется 5. МЗ ДесятичнойЦифры :: 6 или НенулевойЦифры :: 6 илиШестнадцатеричнойЦифры :: 6 равняется 6.МЗ ДесятичнойЦифры :: 7 или НенулевойЦифры :: 7 или ШестнадцатеричнойЦифры ::7 равняется 7.МЗ ДесятичнойЦифры :: 8 или НенулевойЦифры :: 8 или ШестнадцатеричнойЦифры ::8 равняется 8.МЗ ДесятичнойЦифры :: 9 или НенулевойЦифры :: 9 или ШестнадцатеричнойЦифры ::9 равняется 9. МЗ ШестнадцатеричнойЦифры :: a или ШестнадцатеричнойЦифры :: Aравняется 10.МЗ ШестнадцатеричнойЦифры :: b или ШестнадцатеричнойЦифры :: B равняется 11.МЗ ШестнадцатеричнойЦифры :: c или ШестнадцатеричнойЦифры :: C равняется 12.МЗ ШестнадцатеричнойЦифры :: d или ШестнадцатеричнойЦифры :: D равняется 13.МЗ ШестнадцатеричнойЦифры :: e или ШестнадцатеричнойЦифры :: E равняется 14.МЗ ШестнадцатеричнойЦифры :: f или ШестнадцатеричнойЦифры :: F равняется 15.МЗ ШестнадцатеричногоЦелогоЛитерала :: 0x ШестнадцатеричнойЦифры равняетсяМЗ of ШестнадцатеричнойЦифры.МЗ ШестнадцатеричногоЦелогоЛитерала :: 0X ШестнадцатеричнойЦифры равняетсяМЗ of ШестнадцатеричнойЦифры.МЗ ШестнадцатеричногоЦелогоЛитерала :: ШестнадцатеричногоЦелогоЛитералаШестнадцатеричнойЦифры равняется (МЗ of ШестнадцатеричногоЦелогоЛитералаумножить на 16) плюс МЗ ШестнадцатеричнойЦифры.

Как только точное МЗ численного литерала было получено, оно затем округляется кзначению типа Number. Если МЗ равно 0, то округлённое значение равняется +0. Иначе,округлённое значение должно равняться численному значению МЗ (согласноопределению в разделе 8.5), за исключением тех случаев, когда литерал являетсяДесятичнымЛитералом и содержит более 20 значащих цифр. Тогда за численноезначение принимается либо численное значение МЗ литерала, получаемое заменойкаждой значащей цифры после двадцатой на цифру 0, либо численное значение МЗлитерала, получаемое заменой каждой значащей цифры после двадцатой на цифру 0 изатем увеличение литерала на единицу в позиции двадцатой значащей цифры. Цифраявляется значащей, если она не принадлежит ЭкспоненциальнойЧасти и

Page 32: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

она не равна 0, илислева от неё есть ненулевая цифра и справа от неё есть ненулевая цифра, непринадлежащая ЭкспоненциальнойЧасти.

7.8.4 Строковые литералы

Строковой литерал представляет собой ноль или больше символов, заключённых водиночные или двойные кавычки. Каждый символ может быть представлен escape-последовательностью.

Синтаксис

СтроковойЛитерал ::" СимволыДвойнойСтрокиопц " ' СимволыОдинарнойСтрокиопц '

СимволыДвойнойСтроки ::СимволДвойнойСтроки СимволыДвойнойСтрокиопц

СимволыОдинарнойСтроки ::СимволОдинарнойСтроки СимволыОдинарнойСтрокиопц

СимволДвойнойСтроки ::ИсходныйСимвол но не двойная-кавычка " или обратный-слэш \или КонецСтроки \ EscapeПоследовательность

SingleStringCharacter ::ИсходныйСимвол но не одиночная-кавычка ' или обратный-слэш \илиКонецСтроки \ EscapeПоследовательность

EscapeПоследовательность ::СимвольнаяEscapeПоследовательность 0 [предпросмотр ДесятичнаяЦифра] ШестнадцатеричнаяEscapeПоследовательность ЮникоднаяEscapeПоследовательность

СимвольнаяEscapeПоследовательность ::ОдиночныйEscapeСимвол НеEscapeСимвол

ОдиночныйEscapeСимвол :: один из' " \ b f n r t v

НеEscapeСимвол ::ИсходныйСимвол но не EscapeСимвол или КонецСтроки

EscapeСимвол ::ОдиночныйEscapeСимвол ДесятичнаяЦифра x u

Page 33: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ШестнадцатеричнаяEscapeПоследовательность ::x ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра

ЮникоднаяEscapeПоследовательность ::u ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифраШестнадцатеричнаяЦифра

Определение нетерминала ШестнадцатеричнаяЦифра приведено в разделе 7.8.3.ИсходныйСимвол описан в разделах 2 и 6.

Строковой литерал обозначает значение типа String. Строковое значение (СтЗ) литералаописывается через символьные значения (СиЗ) различных частей строкового литерала. Входе этого процесса некоторые символы строкового литерала считаются имеющимиматематическое значение (МЗ) согласно описанию ниже или в разделе 7.8.3.

СтЗ СтроковогоЛитерала :: "" равно пустой последовательности символов.СтЗ СтроковогоЛитерала :: '' равно пустой последовательности символов.СтЗ СтроковогоЛитерала :: " СимволовДвойнойСтроки " равно СтЗСимволовДвойнойСтроки.СтЗ СтроковогоЛитерала :: " СимволовОдинарнойСтроки " равно СтЗСимволовОдинарнойСтроки.СтЗ СимволовДвойнойСтроки :: СимволаДвойнойСтроки равно последовательностииз одного символа, СиЗ СимволаДвойнойСтроки.СтЗ СимволовДвойнойСтроки :: СимволаДвойнойСтроки СимволовДвойнойСтрокиравно последовательности из СиЗ СимволаДвойнойСтроки, за которым следуют попорядку все символы СтЗ СимволовДвойнойСтроки.СтЗ СимволовОдинарнойСтроки :: СимволаОдинарнойСтроки равнопоследовательности из одного символа, СиЗ СимволаОдинарнойСтроки.СтЗ СимволовОдинарнойСтроки :: СимволаОдинарнойСтрокиСимволовОдинарнойСтроки равно последовательности из СиЗСимволаОдинарнойСтроки, за которым следуют по порядку все символы СтЗСимволовОдинарнойСтроки.СиЗ СимволаДвойнойСтроки :: ИсходногоСимвола но не двойной-кавычки " илиобратного-слэша \ или КонцаСтроки равно самому ИсходномуСимволу.СиЗ СимволаДвойнойСтроки :: \ EscapeПоследовательности равно СиЗEscapeПоследовательности. СиЗ СимволаОдинарнойСтроки :: ИсходногоСимвола ноне одинарной-кавычки ' или обратного-слэша \ или КонцаСтроки равно самомуИсходномуСимволу.СиЗ СимволаОдинарнойСтроки :: \ EscapeПоследовательности равно СиЗEscapeПоследовательности.СиЗ EscapeПоследовательности :: СимвольнойEscapeПоследовательности равно СиЗСимвольнойEscapeПоследовательности.СиЗ EscapeПоследовательности :: 0 [предпросмотр ДесятичнойЦифре]равносимволу <NUL> (код Юникода 0000).СиЗ EscapeПоследовательности :: ШестнадцатеричнойEscapeПоследовательностиравно СиЗ ШестнадцатеричнойEscapeПоследовательности.СиЗ EscapeПоследовательности :: ЮникоднойEscapeПоследовательности равно СиЗЮникоднойEscapeПоследовательности.СиЗ СимвольнойEscapeПоследовательности :: ОдиночногоEscapeСимвола равносимволу, код которого определён ОдиночнымEscapeСимволом согласно следующейтаблице:

Page 34: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Escape-прследовательность Код Юникода Наименование Символ\b \u0008 удаление назад <BS>\t \u0009 горизонтальная табуляция <HT>\n \u000A перевод строки (новая строка) <LF>\v \u000B вертикальная табуляция <VT>\f \u000C перевод страницы <FF>\r \u000D возврат каретки <CR>\" \u0022 двойная кавычка "

\' \u0027 одинарная кавычка '

\\ \u005C обратный слэш \

СиЗ СимвольнаяEscapeПоследовательности :: НеEscapeСимвола равно СиЗНеEscapeСимвола.СиЗ НеEscapeСимвола :: ИсходногоСимвола но не EscapeСимвола или КонцаСтрокиравно самому ИсходномуСимволу.СиЗ ШестнадцатеричнойEscapeПоследовательности :: x ШестнадцатеричнойЦифрыШестнадцатеричнойЦифры равно символу, код которого равен (16 умножить на МЗпервой ШестнадцатеричнойЦифры) плюс МЗ второй ШестнадцатеричнойЦифры.СиЗ ЮникоднойEscapeПоследовательности :: u ШестнадцатеричнойЦифрыШестнадцатеричнойЦифры ШестнадцатеричнойЦифры ШестнадцатеричнойЦифрыравно символу, код которого равен (4096 (т.е. 163 ) умножить на МЗ первойШестнадцатеричнойЦифры) плюс (256 (т.е. 162 ) умножить на МЗ второйШестнадцатеричнойЦифры) плюс (16 умножить на МЗ третьейШестнадцатеричнойЦифры) плюс МЗ четвёртой ШестнадцатеричнойЦифры.

ЗАМЕЧАНИЕСимвол 'КонецСтроки' не может появиться в строковом литерале, даже если емупредшествует обратный слэш \. Правильным путём включения символа перевода строкив строковой литерал является использование escape-последовательности, такой как \nили \u000A.

7.8.5 Литералы регулярных выражений

Литерал регулярного выражения - это элемент, который в процессе обработкипреобразовывается к объекту RegExp (раздел 15.10). Объект создаётся до того, какначинается выполнение содержащей его программы или функции. При выполнениипрограммы литерал возвращает ссылку на этот объект; он не создаёт нового объекта.Два отдельных регулярных выражения в программе преобразутся в два объектарегулярных выражений, которые никогда не сравниваются как === (строго равные) другдругу, даже если содержимое литералов является идентичным. Объект типа RegExpтакже может быть создан во время выполнения при помощи выражения new RegExp(раздел 15.10.4) или путём вызова конструктора RegExp как функции (раздел 15.10.3).

Приведённые ниже правила описывают синтаксис литерала регулярного выражения ииспользуются обработчиком входных элементов для нахождения конца литераларегулярного выражения. Строки символов, составляющие ТелоРегулярногоВыражения иФлагиРегулярногоВыражения передаются в необработанном виде конструкторурегулярных выражений, который обрабатывает их своей, более строгой грамматикой.

Page 35: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

Синтаксис

ЛитералРегулярногоВыражения ::/ ТелоРегулярногоВыражения / ФлагиРегулярногоВыражения

ТелоРегулярногоВыражения ::ПервыйСимволРегулярногоВыражения СимволыРегулярногоВыражения

СимволыРегулярногоВыражения ::[пусто] СимволыРегулярногоВыражения СимволРегулярногоВыражения

ПервыйСимволРегулярногоВыражения ::НеОкончание но не * или \ или / ПоследовательностьОбрСлэш

СимволРегулярногоВыражения ::НеОкончание но не\ или / ПоследовательностьОбрСлэш

ПоследовательностьОбрСлэш ::\ НеОкончание

НеОкончание ::ИсходныйСимвол но не КонецСтроки

ФлагиРегулярногоВыражения ::[пусто] ФлагиРегулярногоВыражения ЧастьИдентификатора

ЗАМЕЧАНИЕЛитералы регулярных выражений не могут быть пустыми; вместо того чтобыпредставлять пустой литерал регулярного выражения, последовательность // начинаетоднострочный комментарий. Чтобы указать пустое регулярное выражение, следуетиспользовать /(?:)/.

Семантика

Литерал регулярного выражения обозначает значение типа Object. Это значениеопределяется в два этапа: сначала символы, распознаваемые правилами грамматики вкачестве нетерминалов ТелоРегулярногоВыражения и ФлагиРегулярногоВыражениясобираются в необработанном виде в две строки, называетмые, соответственно, Шаблони Флаги. Затем вызывается конструктор new RegExp с двумя параметрами Шаблон и Флаги,и результат становится значением ЛитералаРегулярногоВыражения. Если вызов new RegExpгенерирует ошибку, реализация может по собственному усмотрению либо выдатьсообщение об ошибке сразу при разборе исходного текста программы, либо отложитьошибку до того момента, когда к значению регулярного выражения обращаетсяпрограмма в ходе своего исполнения.

Page 36: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7.9 Автоматическая вставка точек с запятыми

Некоторые инструкции ECMAScript (пустая инструкция, объявление переменной,инструкция-выражение, инструкция do-while, инструкция continue, инструкция break,инструкция return, и инструкция throw) должны оканчиваться точками с запятыми. Этиточки с запятыми могут явно указываться в тексте. Однако в некоторых случаях, исходяиз соображений удобства, такие точки с запятыми в исходном тексте могут бытьопущены. Эти ситуации описываются высказыванием, гласящим, что точки с запятойавтоматически вставляются в поток токенов исходного текста в этих ситуациях.

7.9.1 Правила автоматической вставки точек с запятыми

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

1. Токен-нарушитель отделён от предыдущего токена как минимум однимКонцомСтроки.

2. Токеном-нарушителем является закрывающая фигурная скобка }.

Когда в ходе последовательного разбора текста программы слева направо потоквходных токенов заканчивается, и парсер не в состоянии распознать весь потоквходящих токенов как единственный нетерминал Программа, то точка с запятойавтоматически добавляется в конец потока.Если в грамматике присутствует ограниченное правило, то первый токен длятерминала или нетерминала, непосредственно следующего за обозначением [здесьнет КонцаСтроки] в описании ограниченного правила, называется ограниченнымтокеном. Когда в ходе последовательного разбора текста программы слева направовстречается токен, который разрешён ограниченным правилом грамматики,является в нём ограниченным токеном и который отделён от предыдущего токена впотоке как минимум одним КонцомСтроки, то перед этим токеном автоматическивставляется точка с запятой.

Однако существует одно общее ограничение на предшествующие правила: точка сзапятой никогда не вставляется автоматически, если бы эту точку пришлось потомобработать бы как пустую инструкцию или если бы эта точка с запятой стала одной източек с запятой в заголовке инструкции for (раздел 12.6.3).

ЗАМЕЧАНИЕНиже перечислены все ограниченные правила в грамматике:

ПостфиксноеВыражение :ЛевостороннееВыражение [здесь нет КонцаСтроки] ++ ЛевостороннееВыражение [здесь нет КонцаСтроки] --

ИнструкцияContinue :continue [здесь нет КонцаСтроки] Идентификаторопц ;

ИнструкцияBreak :break [здесь нет КонцаСтроки] Идентификатор ;

Page 37: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

опц

ИнструкцияReturn :return [здесь нет КонцаСтроки] Выражениеопц ;

ИнструкцияThrow :throw [здесь нет КонцаСтроки] Выражение ;

На практике эффект от этих ограниченных правил следующий:

Когда токен ++ или -- встречается там, где парсер обработал бы его какпостфиксный оператор, и хотя бы один КонецСтроки встретился междупредшествующим токеном и токеном ++ или --, то точка с запятой автоматическивставляется перед токеном ++ или --.Когда встречаются токены continue, break, return или throw и КонецСтроки отделяетих от следующего токена, точка с запятой автоматически вставляется после токеновcontinue, break, return или throw.

Итоговые практические советы программистам на ECMAScript таковы:

Постфиксный оператор ++ или -- должен появляться на той же строке, что и егооперанд.Выражение в инструкциях return или throw должно начинаться на той же строке, чтои токен return или throw.Метка в инструкцииях break или continue должна находиться на той же строке, что итокен break или continue.

7.9.2 Примеры автоматической вставки точек с запятой

Исходный текст

{ 1 2 } 3

не является корректным предложением в грамматике ECMAScript, даже с учётом правилавтоматической вставки точек с запятой. Напротив, исходный текст

{ 1 2 } 3

тоже не является корректным предложением ECMAScript, но преобразуется правиламиавтоматической вставки точек с запятой в следующий:

{ 1 ;2 ;} 3;

который является корректным предложением ECMAScript.

Исходный текст

for (a; b )

не является корректным предложением ECMAScript и не изменяется правилами

Page 38: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

Исходный текст

return a + b

преобразуется правилами автоматической вставки точек с запятой в следующий:

return; a + b;

ЗАМЕЧАНИЕВыражение a + b не используется в качестве значения, возвращаемого инструкциейreturn, так как "КонецСтроки" отделяет его от токена return.

Исходный текст

a = b ++c

преобразуется правилами автоматической вставки точек с запятой в следующий:

a = b; ++c;

ЗАМЕЧАНИЕТокен ++ не принимается за постфиксный оператор, применённый к переменной b,поскольку "КонецСтроки" разделяет b и ++.

Исходный текст

if (a > b) else c = d

не является корректным предложением ECMAScript и не изменяется правиламиавтоматической вставки точек с запятой перед токеном else, несмотря на то, что ни одноиз правил грамматики не применимо в данной точке, потому что автоматическивставленная точка с запятой была бы затем распознана как пустое выражение.

Исходный текст

a = b + c (d + e).print()

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

a = b +c(d + e).print()

В обстоятельствах, когда инструкция присваивания должна начинаться с левой скобки,

Page 39: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

Типы8. Типы

Значение - это сущность, которая может иметь один из девяти типов. Всего определенодевять различных типов (Undefined, Null, Boolean, String, Number, Object, Reference, List иCompletion). Значения типов Reference, List и Completion используются только какпромежуточные результаты вычисления выражений и не могут быть сохранены каксвойства объектов.

8.1 Тип Undefined

Для типа Undefined ("не определено") существует единственное значение - undefined.Значением любой переменной, которой ещё не было присвоено значения, являетсяundefined.

8.2 Тип Null

Для типа Null ("пусто", "ничто") существует единственное значение - null.

8.3 Тип Boolean

Тип Boolean ("булевский", "логический") представляет собой логическую сущность,которая может принимать одно из двух значений: true или false.

8.4 Тип String

Тип String ("строка") представляет собой множество всех конечных упорядоченныхпоследовательностей из нуля или более 16-разрядных беззнаковых целых значений("элементов"). Тип String обычно используется для представления текстовых данных висполняемой программе на ECMAScript. В этом случае каждый элемент строки трактуетсякак значение кода Юникода (см. раздел 6). Каждый элемент считается занимающимопределённую позицию в последовательности. Эти позиции пронумерованынеотрицательными целыми числами. Первый элемент (если присутствует) находится напозиции 0, следующий элемент (если присутствует) на позиции 1, и т.п. Длина строкиравна количеству элементов (т. е. 16-битных значений), из которых она состоит. Пустаястрока имеет длину ноль, и, таким образом, не содержит элементов.

Когда строка содержит текстовые данные, каждый элемент считается за единичный кодUTF-16. Вне зависимости от того, действительно ли используется UTF-16 в качествеформата хранения строки, символы в значении типа String пронумерованы так, как будтоони представлены при помощи UTF-16. Все операции над значениями типа String (заисключением особо обозначенных случаев) работают с ними, как с однороднымипоследовательностями 16-разрядных целых чисел; они не гарантируютнормализованности результирующей строки и не гарантируют языкозависимыхрезультатов.

Page 40: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ЗамечаниеОснованием для подобных решений было стремление сделать реализации типа Stringкак можно более простыми и высокопроизводительными. Подразумевается, чтотекстовые данные, поступающие в среду выполнения извне (например пользовательскийввод, читаемый из файла или получаемый по сети текст и т.п.) должны бытьпреобразованы в нормализованную форму C Юникода ещё до того, как их увидитисполняющаяся программа. Предполагается, что это должно происходить одновременнос преобразованием текста из исходной кодировки в Юникод (и, таким образом, невносит дополнительных затрат по времени или сложности). Поскольку рекомендуется,чтобы исходный код программы на ECMAScript был в нормализованной форме C,гарантируется нормализованность строковых литералов (при условии нормализацииисходного кода), если они не содержат юникодных escape-последовательностей.

8.5 Тип Number

У типа Number ("число") имеется ровно 18 437 736 874 454 810 627 (т.е., 264-253 +3)различных значений, представляющих 64-разрядные значения двойной точностиформата IEEE 754 согласно Стандарту IEEE на двоичную арифметику с плавающейзапятой, за исключением того, что 9007199254740990 (т.е., 253-2) различных значений"не-число" Стандарта IEEE представлены в ECMAScript как единственное специальноезначение NaN. (Заметим, что значение NaN получается в программе при помощивыражения NaN, если глобальная переменная NaN не была изменена в ходе выполненияпрограммы.) В некоторых реализациях для внешнего кода различные значения "не-число" могут быть различимыми, но такое поведение зависит от конкретной реализации.Для кода на ECMAScript все значения NaN являются неотличимыми друг от друга.

Существуют два других особых значения, называемые положительная бесконечность иотрицательная бесконечность. Для краткости и в пояснительных целях эти значениятакже могут обозначаться +∞ и -∞ соответственно. (Заметим, что эти два значенияполучаются в программе при помощи выражений +Infinity (или просто Infinity) и -Infinity, если глобальная переменная Infinity не была изменена в ходе выполненияпрограммы.)

Прочие 18 437 736 874 454 810 624 (т.е. 264-253) значений называются конечнымичислами. Половина из этих значений является положительными числами, а половина -отрицательными. Для каждого конечного положительного числа имеетсясоответствующее отрицательное число, равное ему по модулю.

Заметим, что существуют как положительный ноль, так и отрицательный ноль.Длякраткости и в пояснительных целях эти значения также могут обозначаться +0 и -0соответственно. (Заметим, что эти два нулевых числовых значения получаются припомощи выражений +0 (или просто 0) и -0.)

18 437 736 874 454 810 622 (т.е., 264-253-2) конечных ненулевых значенийразделяются на два типа:

18 428 729 675 200 069 632 (т.е., 264-254) из них нормализованы и имеют вид

s * m * 2e

где s равно +1 or -1, m - положительное целое меньше, чем 253, но не меньше чем 252

Page 41: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

и e - целое в диапазоне от -1074 до 971 включительно.

Оставшиеся 9 007 199 254 740 990 (т.е. 253-2) значений денормализованы и имеют вид:

s * m * 2e

где s равно +1 or -1, m - положительное целое, меньше чем 252 и e равно -1074.

Заметим, что все положительные и отрицательные целые, модуль которых не превышает253, представимы типом Number (причём у 0 есть два представления: +0 и -0).

Конечное число является нечётно значимым, если оно не равно нулю и целое m,использованное для его представления (в одном из приведённых выше видов) -нечётное. Иначе оно является чётно значимым.

В данной спецификации фраза "численное значение x", где x обозначает точноененулевое вещественное математическое значение (которое может даже являтьсяиррациональным числом, таким как π), означает численное значение, выбранное последующему принципу. Представим множество всех конечных значений типа Number, изкоторого удалён -0 и добавлены два дополнительных значения, не представимых в типеNumber: 21024 (т.е. +1 * 253 * 2971) и -21024 (т.е. -1 * 253 * 2971 ). Выберем из этогомножества элемент, наиболее близкий по значению к x. Если два значения в множествеявляются одинаково близкими, из них выбирается чётно значимое, причём для этихцелей два дополнительных значения 21024 и -21024 считаются чётно значимыми.Наконец, если было выбрано 21024, заменяем его на +∞; если было выбрано -21024,заменяем его на -∞; если было выбрано +0, заменяем его на -0 в том и только в томслучае, когда x меньше нуля; любое другое значение оставляем без изменений. Результатявляется численным значением для x. (Эта процедура в точности соответствует режиму"округление к ближайшему" стандарта IEEE 754.)

Некоторые операторы ECMAScript работают только с целыми значениями из диапазона от-231 д о 231-1 включительно или из диапазона от 0 до 232-1 включительно. Этиоператоры принимают любое значение типа Number, но предварительнопреобразовывают каждое из таких значений к одному из 232 целочисленных значений.См. описания операторов ToInt32 и ToUint32 в разделах 0 и 0 соответственно.

8.6 Тип Object

Object ("объект") представляет собой неупорядоченный набор свойств. Каждое свойствосостоит из имени, значения и набора атрибутов.

8.6.1 Атрибуты свойства

Свойство может обладать нулём или более атрибутов из следующего множества:

Атрибут Описание

ReadOnly

Это свойство является свойством только для чтения. Попытки записать в этосвойство в коде ECMAScript будут проигнорированы. (Однако заметим, что внекоторых случаях значение свойства с атрибутом ReadOnly может современем изменяться в зависимости от действий, производимых средойвыполнения. Таким образом "только для чтения" не означает "постоянное и

Page 42: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

неизменное"!)DontEnum Свойство не должно перечисляться в ходе цикла for-in (раздел 12.6.4).

DontDelete Попытки удалить свойство будут проигнорированы. См. описание оператораdelete в разделе 11.4.1.

InternalВнутреннее свойство - не имеет имени и не доступно напрямую черезоператоры доступа к свойствам. Доступ к этим свойствам зависит отконкретной реализации. Случаи использования некоторых из этих свойствописываются в спецификации языка.

8.6.2 Внутренние свойства и методы

Внутренние свойства и методы не являются частью языка. Они определены даннойспецификацией исключительно для разъяснительных целей. Реализация ECMAScriptдолжна вести себя, как будто она создаёт и использует внутренние свойства согласноприведённому здесь описанию. В данном документе имена внутренних свойств будутзаключаться в двойные прямоугольные скобки [[ ]]. Когда алгоритм используетвнутреннее свойство, которое не реализовано в данном объекте, бросается исключениеTypeError.

Существуют два типа доступа к обычным (не внутренним) свойствам: get и put,отвечающие соответственно за чтение и присваивание.

Нативные объекты ECMAScript обладают внутренним свойством [[Prototype]]. Значениемэтого свойства является либо null, либо объект. Это значение используется дляреализации наследования. Свойства объекта [[Prototype]] видятся как свойства дочернегообъекта с точки зрения доступа get, но не с точки зрения доступа put.

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

Свойство Параметры Описание[[Prototype]] нет Прототип данного объекта.[[Class]] нет Строковое значение, обозначающее тип данного объекта.

[[Value]] нет Внутренняя информация о состоянии, связанная с даннымобъектом.

[[Get]] (ИмяСвойства) Возвращает значение свойства.

[[Put]] (ИмяСвойства,Значение) Записывает Значение в указанное свойство.

[[CanPut]] (ИмяСвойства)Возвращает булевское значение, описывающее, можно лиуспешно использовать операцию [[Put]] с даннымИменемСвойства.

[[HasProperty]] (ИмяСвойства) Возвращает булевское значение, описывающее, существуетли уже у объекта свойство с данным именем.

[[Delete]] (ИмяСвойства) Удаляет указанное свойство из объекта.

[[DefaultValue]] (Подсказка)Возвращает для объекта значение по умолчанию, котороедолжно являться примитивным значением (не объект илиссылка).

Page 43: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

[[Construct]]списокаргументовпереданныйвызывающим

Создаёт объект. Вызывается при помощи оператора new.Объекты, в которых реализован этот внутренний метод,называются конструкторами.

[[Call]]списокаргументовпереданныйвызывающим

Выполняет код, связанный с данным объектом. Вызываетсяпри помощи выражения вызова функции. Объекты, вкоторых реализован этот внутренний метод, называютсяфункциями.

[[HasInstance]] (Свойство)Возвращает булевское значение, описывающее, делегируетли Value своё поведение данному объекту. Из всехнативных объектов ECMAScript только в Functionреализован метод [[HasInstance]].

[[Scope]] нет Иерархия областей видимости, определяющая среду, вкоторой исполняется объект Function.

[[Match]] (Строка,Индекс)

Проверяет соответствие регулярному выражению ивозвращает значение MatchResult (см. раздел 15.10.2.1).

В каждом объекте (включая объекты среды) должны быть реализованы свойства[[Prototype]] и [[Class]] и методы [[Get]], [[Put]], [[CanPut]], [[HasProperty]], [[Delete]] и[[DefaultValue]]. (Однако заметим, что для некоторых объектов метод [[DefaultValue]]может просто бросать исключение TypeError.)

Значением свойства [[Prototype]] ("прототип") может быть либо объект, либо null, икаждая цепь [[Prototype]] должна иметь конечную длину (т.е. если начать с любогообъекта, рекурсивный переход на его свойство [[Prototype]] должен в конечном итогепривести к значению null). Наличие возможности использования объекта среды вкачестве значения свойства [[Prototype]] для нативного объекта определяется конкретнойреализацией.

Значение свойства [[Class]] определено данной спецификацией для всех типоввстроенных объектов. Для объекта среды значение свойства [[Class]] может быть любым идаже совпадать со значением свойства [[Class]] для встроенного объекта. Значениесвойства [[Class]] используется реализацией языка для различения разных типоввстроенных объектов. Заметим, что данная спецификация не обеспечивает никакихспособов доступа к этому значению в программе, за исключениемObject.prototype.toString (см. 15.2.4.2).

Для нативных объектов методы [[Get]], [[Put]], [[CanPut]], [[HasProperty]], [[Delete]] и[[DefaultValue]] ведут себя согласно описанию в разделах 8.6.2.1, 8.6.2.2, 8.6.2.3,8.6.2.4, 8.6.2.5 и 8.6.2.6 соответственно, за исключением того, что объекты Arrayреализуют метод [[Put]] несколько иначе (см. раздел 15.4.5.1). Объекты среды могутреализовывать эти методы произвольным путём, если обратное не указывается явно.Например, существует возможность, что методы [[Get]] и [[Put]] для некоторого объектадействительно читают и записывают значения в различные свойства, но при этом[[HasProperty]] всегда возвращает false.

В нижеприведённых описаниях алгоритмов предполагается, что O - это нативный объектECMAScript, а P - строка.

8.6.2.1 [[Get]](P)

Page 44: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Когда метод [[Get]] объекта O вызывается с именем свойства P, предпринимаютсяследующие шаги:

1. Если у O нет свойства с именем P - переход на шаг 4.

2. Получить значение свойства.

3. Вернуть Результат(2).

4. Если свойство [[Prototype]] объекта O равно null - вернуть undefined.

5. Вызвать метод [[Get]] у значения свойства [[Prototype]], передав имя свойства P.

6. Вернуть Результат(5).

8.6.2.2 [[Put]](P, V)

Когда метод [[Get]] объекта O вызывается с именем свойства P и значением V,предпринимаются следующие шаги:

1. Вызвать метод [[CanPut]] у объекта O, передав имя P.

2. Если Результат(1) равен false - возврат.

3. Если у O нет свойства с именем P - переход на шаг 6.

4. Установить значение свойства равным V. Атрибуты свойства при этом не изменяются.

5. Возврат.

6. Создать свойство с именем P, установить его значение в V и дать ему пустыеатрибуты.

7. Возврат.

Заметим, однако, что если O - объект типа Array, его метод [[Put]] работает несколькосложнее (15.4.5.1).

8.6.2.3 [[CanPut]](P)

Метод [[CanPut]] используется только методом [[Put]].

Когда метод [[CanPut]] объекта O вызывается для свойства P, предпринимаютсяследующие шаги:

1. Если у O нет свойства с именем P - переход на шаг 4.

2. Если у свойства есть атрибут ReadOnly - вернуть false.

3. Вернуть true.

4. Если значение свойства [[Prototype]] объекта O равно null - вернуть true.

5. Вызвать метод [[CanPut]] для значения [[Prototype]] объекта O, передав имя свойства P.

Page 45: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Вернуть Результат(5).

8.6.2.4 [[HasProperty]](P)

Когда метод [[HasProperty]] объекта O вызывается с именем свойства P, предпринимаютсяследующие шаги:

1. Если у O есть свойство с именем P - вернуть true.

2. Если значение свойства [[Prototype]] объекта O равно null - вернуть false.

3. Вызвать метод [[HasProperty]] у значения свойства [[Prototype]], передав имя свойства P.

4. Вернуть Результат(3).

8.6.2.5 [[Delete]](P)

Когда метод [[Delete]] объекта O вызывается с именем свойства P, предпринимаютсяследующие шаги:

1. Если у O нет свойства с именем P - вернуть true.

2. Если у свойства есть атрибут DontDelete - вернуть false.

3. Удалить свойство с именем P из объекта O.

4. Вернуть true.

8.6.2.6 [[DefaultValue]](подсказка)

Когда метод [[DefaultValue]] объекта O вызывается с подсказкой типа String,предпринимаются следующие шаги:

1. Вызвать метод [[Get]] у объекта O, передав в качестве аргумента "toString".

2. Если Результат(1) не является объектом - переход на шаг 5.

3. Вызвать метод [[Call]] у Результата(1), передав ему O в качестве значения this и пустойсписок аргументов.

4. Если Результат(3) является примитивным значением - вернуть Результат(3).

5. Вызвать метод [[Get]] объекта O, передав в качестве аргумента "valueOf".

6. Если Результат(5) не является объектом - переход на шаг 9.

7. Вызвать метод [[Call]] у Результата(5), передав ему O в качестве значения this и пустойсписок аргументов.

8. Если Результат(7) является примитивным значением - вернуть Результат(7).

9. Бросить исключение TypeError.

Когда метод [[DefaultValue]] объекта O вызывается с подсказкой типа Number,предпринимаются следующие шаги:

Page 46: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Вызвать метод [[Get]] объекта O, передав в качестве аргумента "valueOf".

2. Если Результат(1) не является объектом - переход на шаг 5.

3. Вызвать метод [[Call]] у Результата(1), передав ему O в качестве значения this и пустойсписок аргументов.

4. Если Результат(3) является примитивным значением - вернуть Результат(3).

5. Вызвать метод [[Get]] у объекта O, передав в качестве аргумента "toString".

6. Если Результат(5) не является объектом - переход на шаг 9.

7. Вызвать метод [[Call]] у Результата(5), передав ему O в качестве значения this и пустойсписок аргументов.

8. Если Результат(7) является примитивным значением - вернуть Результат(7).

9. Бросить исключение TypeError.

Когда метод [[DefaultValue]] объекта O вызывается без указания подсказки, он ведёт себя,как будто в качестве подсказки было указано Number, за исключением случая, когда O -объект типа Date (см. 15.9), в котором он ведёт себя, как будто в качестве подсказкибыло указано String.

Вышеприведённая спецификация метода [[DefaultValue]] для нативных объектов можетвозвращать только примитивные методы. Если объект среды реализует свой собственныйметод [[DefaultValue]], он должен обеспечить, чтобы его метод [[DefaultValue]] возвращалтолько примитивные значения.

8.7 Тип Reference

Внутрений тип Reference ("ссылка") не является языковым типом данных. Он определенданной спецификацией исключительно для разъяснительных целей. РеализацияECMAScript должна вести себя, как будто она создаёт и использует ссылки согласноприведённому здесь описанию. Однако значение типа Reference используется только какпромежуточный результат вычисления выражения и не может быть сохранено какпеременная или свойство.

Тип Reference используется для объяснения поведения таких операторов как delete,typeof и операторы присваивания. Например в качестве левостороннего операндаоперации присваивания ожидается ссылка. В качестве альтернативы, поведениеприсваивания могло бы быть объяснено анализом конкретной синтаксической формылевостороннего операнда операции присваивания, но с одним осложнением: вызовыфункций могут возвращать ссылки. Такая возможность включена исключительно радиобъектов среды. Ни одна встроенная функция ECMAScript, определённая в даннойспецификации, не возвращает ссылки, и не существует возможности вернуть ссылку изпользовательской функции. (Ещё одним доводом против неиспользованиясинтаксического анализа является то, что подобный подход был бы длинным инеудобным, затрагивая при этом многие части спецификации.)

Другим применением для типа Reference является объяснение определения значения this

Page 47: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

в вызове функции.

Значение Reference является ссылкой на свойство объекта. Значение Reference состоит издвух компонент, базового объекта и имени свойства.

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

ПолучитьБазу(V). Получает компоненту базового объекта для ссылки V.ПолучитьИмяСвойства(V). Возвращает компоненту имени свойства для ссылки V.

Следующие абстрактные операции используются в данной спецификации длясовершения операций над ссылками:

8.7.1 ПолучитьЗначение(V)

1. Если Тип(V) не Reference - вернуть V.

2. Вызвать ПолучитьБазу(V).

3. Если Результат(2) равен null - бросить исключение ReferenceError.

4. Вызвать метод [[Get]] объекта Результат(2), передавая ПолучитьИмяСвойства( V) вкачестве имени свойства.

5. Вернуть Результат(4).

8.7.2 ЗаписатьЗначение(V, W)

1. Если Тип(V) не Reference - бросить исключение ReferenceError.

2. Вызвать ПолучитьБазу(V).

3. Если Результат(2) равен null - переход на шаг 6.

4. Вызвать метод [[Put]] объекта Результат(2), передавая ПолучитьИмяСвойства( V) вкачестве имени свойства и W в качестве значения.

5. Возврат.

6. Вызвать метод [[Put]] для глобального объекта, передавая ПолучитьИмяСвойства( V) вкачестве имени свойства и W в качестве значения.

7. Возврат.

8.8 Тип List

Внутрений тип List ("список") не является языковым типом данных. Он определен даннойспецификацией исключительно для разъяснительных целей. Реализация ECMAScriptдолжна вести себя, как будто она создаёт и использует значения типа List согласноприведённому здесь описанию. Однако значение типа List используется только какпромежуточный результат вычисления выражения и не может быть сохранено какпеременная или свойство.

Page 48: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Тип List используется для объяснения поведения списков аргументов (см. 11.2.4),используемых в выражениях new и вызовах функций. Значения типа List представляют изсебя простые упорядоченные последовательности значений. Эти последовательностимогут иметь любую длину.

8.9 Тип Completion

Внутрений тип Completion ("завершение") не является языковым типом данных. Онопределен данной спецификацией исключительно для разъяснительных целей.Реализация ECMAScript должна вести себя, как будто она создаёт и использует значениятипа Completion согласно приведённому здесь описанию. Однако значение типаCompletion используется только как промежуточный результат вычисления выражения ине может быть сохранено как переменная или свойство.

Тип Completion используется для объяснения поведения инструкций (break, continue,return и throw) которые производят передачу управления наружу из локальной областикода. Значения типа Completion представляют из себя триплеты вида (тип, значение,цель), где тип - один из normal, break, continue, return или throw, значение - любоезначение ECMAScript или пусто, а цель - любой идентификатор ECMAScript или пусто.

Термин "предварительное завершение" означает любое завершение с типом, отличнымот normal.

Преобразование типов9. Преобразование типов

Среда выполнения ECMAScript выполняет автоматическое преобразование типа понеобходимости. Чтобы разъяснить семантику, полезно определить набор операторовпреобразования. Эти операторы не являются частью языка. Они определены здесь дляудобства определения семантики языка. Операторы сравнения полиморфны, то есть онимогут принимать значения любых стандартных типов, кроме типов Reference, List илиCompletion (т.е. внутренних типов).

9.1 ToPrimitive

Оператор ToPrimitive ("к примитивному") принимает аргумент Значение и опциональныйаргумент ПредпочтительныйТип. Оператор ToPrimitive преобразует свой аргумент-значение в тип, не являющийся типом Object. Если объект может быть преобразован кболее чем одному примитивному типу, он может использовать опциональную подсказкуПредпочтительныйТип, чтобы выбрать один из них. Преобразование происходитсогласно следующей таблице:

Входнойтип Результат

Undefined Результат совпадает с входным аргументом (преобразование непроизводится).

Null Результат совпадает с входным аргументом (преобразование непроизводится).Результат совпадает с входным аргументом (преобразование не

Page 49: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Boolean производится).

Number Результат совпадает с входным аргументом (преобразование непроизводится).

String Результат совпадает с входным аргументом (преобразование непроизводится).

Object

Возвращает значение по умолчанию для объекта. Значение по умолчанию дляобъекта получается путём вызова для объекта внутреннего метода[[DefaultValue]] с передачей ему опциональной подсказкиПредпочтительныйТип. Поведение метода [[DefaultValue]] определяетсяданной спецификацией для всех нативных объектов ECMAScript (8.6.2.6).

9.2 ToBoolean

Оператор ToBoolean ("к булевскому") преобразует свой аргумент в значение типа Booleanсогласно следующей таблице:

Входнойтип Результат

Undefined falseNull false

Boolean Результат совпадает с входным аргументом (преобразование непроизводится).

Number Результат равен false, если аргумент равен +0, -0 или NaN, иначе результатравен true.

String Результат равен false, если аргумент является пустой строкой (его длинаравна нулю), иначе результат равен true.

Object true9.3 ToNumber

Оператор ToNumber ("к числу") преобразует свой аргумент в значение типа Numberсогласно следующей таблице:

Входнойтип Результат

Undefined NaNNull +0

Boolean Результат равен 1, если аргумент равен true. Результат равен +0, еслиаргумент равен false.

Number Результат совпадает с входным аргументом (преобразование непроизводится).

String См. грамматику и замечание ниже.

Object

Применяются следующие шаги:

1. Вызвать ToPrimitive(входной аргумент, подсказка Number).

2. Вызвать ToNumber(Результат(1)).

3. Вернуть Результат(2).

Page 50: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

9.3.1 ToNumber в применении к типу String

Когда метод ToNumber вызывается для строки, он применяет к ней следующуюграмматику. Если грамматика не может расшифровать строку как нетерминалСтроковойЧисленныйЛитерал, то результатом вызова ToNumber является NaN.

СтроковойЧисленныйЛитерал :::СтрПробеловопц СтрПробеловопц СтрЧисленныйЛитерал СтрПробеловопц

СтрПробелов :::СтрСимвПробела СтрПробеловопц

СтрСимвПробела :::<TAB> <SP> <NBSP> <FF> <VT> <CR> <LF> <LS> <PS> <USP>

СтрЧисленныйЛитерал :::СтрДесятичныйЛитералШестнадцатеричныйЦелыйЛитерал

СтрДесятичныйЛитерал :::СтрБеззнаковыйДесятичныйЛитерал + СтрБеззнаковыйДесятичныйЛитерал - СтрБеззнаковыйДесятичныйЛитерал

СтрБеззнаковыйДесятичныйЛитерал :::Infinity ДесятичныеЦифры . ДесятичныеЦифрыопц ЭкспоненциальнаяЧастьопц . ДесятичныеЦифры ЭкспоненциальнаяЧастьопц ДесятичныеЦифры ЭкспоненциальнаяЧастьопц

ДесятичныеЦифры :::ДесятичнаяЦифра ДесятичныеЦифры ДесятичнаяЦифра

ДесятичнаяЦифра ::: одна из0 1 2 3 4 5 6 7 8 9

ЭкспоненциальнаяЧасть :::ПризнакЭкспоЗаписи ЗнаковоеЦелое

ПризнакЭкспоЗаписи ::: один из

Page 51: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

e E

ЗнаковоеЦелое :::ДесятичныеЦифры + ДесятичныеЦифры - ДесятичныеЦифры

ШестнадцатеричныйЦелыйЛитерал :::ШестнадцатеричнаяЦифра0x ШестнадцатеричнаяЦифра 0X ШестнадцатеричнаяЦифраШестнадцатеричныйЦелыйЛитерал ШестнадцатеричнаяЦифра

ШестнадцатеричнаяЦифра ::: одна из0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

Следует отметить некоторые различия между синтаксисомСтроковогоЧисленногоЛитерала и ЧисленногоЛитерала (см. 7.8.3):

Перед или после СтроковогоЧисленногоЛитерала могут идти пробелы и/или концыстрок.В начале десятичного СтроковогоЧисленногоЛитерала может идти любоеколичество цифр 0.Перед СтроковымДесятичнымЛитералом может встретиться символ + или -, которыйопределяет его знак.Пустой или состоящий из одних пробелов СтроковойЧисленныйЛитералпреобразует в +0.

Преобразование строки в численное значение в целом сходно с определениемчисленного значения численного литерала (см. 7.8.3), но различается в некоторыхдеталях, поэтому процесс преобразования строкового численного литерала в значениетипа Number приводится здесь целиком. Значение определяется в два шага: сначаламатематическое значение (МЗ) получается из строкового численного литерала, потомматематическое значение округляется согласно описанной ниже схеме:

МЗ СтроковогоЧисленногоЛитерала ::: [пусто] равно 0.МЗ СтроковогоЧисленногоЛитерала ::: СтрПробелов равно 0.МЗ СтроковогоЧисленногоЛитерала ::: СтрПробеловопц СтрЧисленногоЛитералаСтрПробеловопц равно МЗ СтрЧисленногоЛитерала вне зависимости от того,присутствуют пробелы или нет.МЗ СтрЧисленногоЛитерала ::: СтрДесятичногоЛитерала равняется МЗСтрДесятичногоЛитерала.МЗ СтрЧисленногоЛитерала ::: ШестнадцатеричногоЦелогоЛитерала равняется МЗШестнадцатеричногоЦелогоЛитерала.МЗ СтрЧисленногоЛитерала ::: СтрДесятичногоЛитерала равняется МЗСтрДесятичногоЛитерала.МЗ СтрЧисленногоЛитерала ::: + СтрБеззнаковогоДесятичногоЛитерала равняется МЗСтрБеззнаковогоДесятичногоЛитерала.МЗ СтрЧисленногоЛитерала ::: - СтрБеззнаковогоДесятичногоЛитерала равняется МЗСтрБеззнаковогоДесятичногоЛитерала, взятому с отрицательным знаком. (Заметим,что если МЗ СтрБеззнаковогоДесятичногоЛитерала равно 0, отрицательнымзначением для него тоже берётся 0. Описанное ниже правило округленияпроизводит округление этого беззнакового метатематического нуля до +0 или -0 в

Page 52: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

зависимости от обстоятельств.)МЗ СтрБеззнаковогоДесятичногоЛитерала ::: Infinity ("бесконечности") равняется1010000 (т.е. столь большое значение, что оно округлится до +∞ ).МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр. равно МЗДесятичныхЦифр. МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр.ДесятичныхЦифр равно сумме МЗ первых ДесятичныхЦифр и (МЗ вторыхДесятичныхЦифр, умноженного на 10-n ), где n - число символов во вторыхДесятичныхЦифрах.МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр.ЭкспоненциальнойЧасти равно МЗ ДесятичныхЦифр умноженному на 10e, где eравно МЗ ЭкспоненциальнойЧасти.МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр. ДесятичныхЦифрЭкспоненциальнойЧасти равно МЗ суммы первых ДесятичныхЦифр и (МЗ вторыхДесятичныхЦифр, умноженному на 10-n )), умноженной на 10e, где n - числосимволов во вторых ДесятичныхЦифрах и e равно МЗ ЭкспоненциальнойЧасти.МЗ СтрБеззнаковогоДесятичногоЛитерала ::: . ДесятичныхЦифр равно МЗДесятичныхЦифр умноженному на 10-n, где n равно числу символов вДесятичныхЦифрах.МЗ СтрБеззнаковогоДесятичногоЛитерала ::: . ДесятичныхЦифрЭкспоненциальнойЧасти равно МЗ ДесятичныхЦифр умноженному на 10e-n, где nравно числу символов в ДесятичныхЦифрах, а e равно МЗ ЭкспоненциальнойЧасти.МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр равно МЗДесятичныхЦифр.МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифрЭкспоненциальнойЧасти равно МЗ ДесятичныхЦифр умноженному на 10e, где eравно МЗ ЭкспоненциальнойЧасти.МЗ ДесятичныхЦифр ::: ДесятичнойЦифры равно МЗ ДесятичнойЦифры. МЗДесятичныхЦифр ::: ДесятичныхЦифр ДесятичнойЦифры равно сумме (МЗДесятичныхЦифр умноженного на 10) и МЗ ДесятичнойЦифры.МЗ ЭкспоненциальнойЧасти ::: ПризнакаЭкспоЗаписи ЗнаковогоЦелого равняется МЗЗнаковогоЦелого.МЗ ЗнаковогоЦелого ::: ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.МЗ ЗнаковогоЦелого ::: + ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.МЗ ЗнаковогоЦелого ::: - ДесятичныхЦифр равняется взятому с отрицательнымзнаком МЗ ДесятичныхЦифр.МЗ ДесятичнойЦифры ::: 0 или ШестнадцатеричнойЦифры ::: 0 равняется 0.МЗ ДесятичнойЦифры ::: 1 или ШестнадцатеричнойЦифры ::: 1 равняется 1.МЗ ДесятичнойЦифры ::: 2 или ШестнадцатеричнойЦифры ::: 2 равняется 2.МЗ ДесятичнойЦифры ::: 3 или ШестнадцатеричнойЦифры ::: 3 равняется 3.МЗ ДесятичнойЦифры ::: 4 или ШестнадцатеричнойЦифры ::: 4 равняется 4.МЗ ДесятичнойЦифры ::: 5 или ШестнадцатеричнойЦифры ::: 5 равняется 5.МЗ ДесятичнойЦифры ::: 6 или ШестнадцатеричнойЦифры ::: 6 равняется 6.МЗ ДесятичнойЦифры ::: 7 или ШестнадцатеричнойЦифры ::: 7 равняется 7.МЗ ДесятичнойЦифры ::: 8 или ШестнадцатеричнойЦифры ::: 8 равняется 8.МЗ ДесятичнойЦифры ::: 9 или ШестнадцатеричнойЦифры ::: 9 равняется 9.МЗ ШестнадцатеричнойЦифры ::: a или ШестнадцатеричнойЦифры ::: A равняется 10.МЗ ШестнадцатеричнойЦифры ::: b или ШестнадцатеричнойЦифры ::: B равняется 11.МЗ ШестнадцатеричнойЦифры ::: c или ШестнадцатеричнойЦифры ::: C равняется 12.МЗ ШестнадцатеричнойЦифры ::: d или ШестнадцатеричнойЦифры ::: D равняется 13.МЗ ШестнадцатеричнойЦифры ::: e или ШестнадцатеричнойЦифры ::: E равняется 14.

Page 53: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

МЗ ШестнадцатеричнойЦифры ::: f или ШестнадцатеричнойЦифры ::: F равняется 15.МЗ ШестнадцатеричногоЦелогоЛитерала ::: 0x ШестнадцатеричнойЦифры равняетсяМЗ ШестнадцатеричнойЦифры.МЗ ШестнадцатеричногоЦелогоЛитерала ::: 0X ШестнадцатеричнойЦифры равняетсяМЗ ШестнадцатеричнойЦифры.МЗ ШестнадцатеричногоЦелогоЛитерала ::: ШестнадцатеричногоЦелогоЛитералаШестнадцатеричнойЦифры равняется сумме (МЗШестнадцатеричногоЦелогоЛитерала умноженного на 16) и МЗШестнадцатеричнойЦифры.

После того как для строкового численного литерала было определено точное МЗ, оноокругляется к значению типа Number. Если МЗ равно 0, то округлённое значение обычноравно +0. Исключение составляют случаи, когда первым непробельным символомстрокового численного литерала является '-', тогда округлённое значение равно -0. Длядругих значений МЗ в качестве округлённого берётся численное значение для МЗ(согласно определению в разделе 8.5), за исключением тех случаев, когда литералвключает в себя СтрБеззнаковыйДесятичныйЛитерал и содержит более 20 значащихцифр. Тогда за численное значение принимается либо численное значение МЗ литерала,получаемое заменой каждой значащей цифры после двадцатой на цифру 0, либочисленное значение МЗ литерала, получаемое заменой каждой значащей цифры последвадцатой на цифру 0 и затем увеличением литерала на единицу в позиции двадцатойзначащей цифры. Цифра является значащей, если она не принадлежитЭкспоненциальнойЧасти и

она не равна 0, илислева от неё есть ненулевая цифра и справа от неё есть ненулевая цифра, непринадлежащая ЭкспоненциальнойЧасти.

9.4 ToInteger

Оператор ToInteger ("к целому") преобразует свой аргумент в целочисленное значение.Оператор работает по следующей схеме:

1. Вызвать оператор ToNumber для входного аргумента.

2. Если Результат(1) равен NaN - вернуть +0.

3. Если Результат(1) равен +0, -0, +∞ или -∞ - вернуть Результат(1).

4. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).

5. Вернуть Результат(4).

9.5 ToInt32: (Знаковое 32-разрядное целое)

Оператор ToInt32 преобразует свой аргумент к одному из 232 целых значений вдиапазоне от -231 до 231-1 включительно. Оператор работает по следующей схеме:

1. Вызвать оператор ToNumber для входного аргумента.

2. Если Результат(1) равен NaN, +0, -0, +∞ или -∞ - вернуть +0.

3. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).

Page 54: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

4. Вычислить Результат(3) modulo 232, т.е. конечное целочисленное значение k типаNumber с положительным знаком и меньшее 232 такое, что разница междуРезультатом(3) и k математически кратна 232 .

5. Если Результат(4) больше или равен 231 - вернуть Результат(4)-232 , иначе вернутьРезультат(4).

ЗАМЕЧАНИЕДля вышеприведённого определения ToInt32:

Операция ToInt32 является тождественной: если она применяется к результатуприменения этой операции, второе применение не меняет результата.

ToInt32(ToUint32(x)) эквивалентно ToInt32(x) для всех значений x. (Именно длясохранения этого последнего свойства +∞ и -∞ отображаются на +0.)

ToInt32 отображает -0 на +0.

9.6 ToUint32: (Беззнаковое 32-разрядное целое)

Оператор ToInt32 преобразует свой аргумент к одному из 232 целых значений вдиапазоне от 0 до 232-1 включительно. Оператор работает по следующей схеме:

1. Вызвать оператор ToNumber для входного аргумента.

2. Если Результат(1) равен NaN, +0, -0, +∞ или -∞ - вернуть +0.

3. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).

4. Вычислить Результат(3) modulo 232, т.е. конечное целочисленное значение k типаNumber с положительным знаком и меньшее 232 такое, что разница междуРезультатом(3) и k математически кратна 232 .

5. Вернуть Результат(4).

ЗАМЕЧАНИЕ Для вышеприведённого определения ToUInt32:

Шаг 5 является единственным различием между ToUint32 и ToInt32.

Операция ToUint32 является тождественной: если она применяется к результатуприменения этой операции, второе применение не меняет результата.

ToUint32(ToInt32(x)) эквивалентно ToUint32(x) для всех значений x. (Именно длясохранения этого последнего свойства +∞ и -∞ отображаются на +0.)

ToUint32 отображает -0 на +0.

9.7 ToUint16: (Беззнаковое 16-разрядное целое)

Оператор ToUint16 преобразует свой аргумент к одному из 216 целых значений в16

Page 55: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

диапазоне от 0 до 2 -1 включительно. Оператор работает по следующей схеме:

1. Вызвать оператор ToNumber для входного аргумента.

2. Если Результат(1) равен NaN, +0, -0, +∞ или -∞ - вернуть +0.

3. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).

4. Вычислить Результат(3) modulo 216, т.е. конечное целочисленное значение k типаNumber с положительным знаком и меньшее 216 такое, что разница междуРезультатом(3) и k математически кратна 216 .

5. Вернуть Результат(4).

ЗАМЕЧАНИЕДля вышеприведённого определения ToUint16:

Замена 232 на 216 на шаге 4 является единственным различием между ToUint32 иToUint16.

ToUint16 отображает -0 на +0.

9.8 ToString

Оператор ToString (" к строке") преобразует свой аргумент к значению типа Stringсогласно следующей таблице:

Входной тип РезультатUndefined "undefined"

Null "null"

Boolean Если аргумент равен true, то результат равен "true". Если аргумент равен false, то результат равен "false".

Number См. замечание ниже.String Возвращает входной аргумент (преобразование не производится)

ObjectПрименяются следующие шаги: 1. Вызвать ToPrimitive(входной аргумент, подсказка String). 2. Вызвать ToString(Результат(1)). 3. Вернуть Результат(2).

9.8.1 ToString применённый к типу Number

Оператор ToString преобразует число m в строковой формат по следующей схеме:

1. Если m равно NaN - вернуть строку "NaN".

2. Если m равно +0 или -0 - вернуть строку "0".

3. Если m меньше нуля - вернуть строковую конкатенацию строки "-" и ToString(-m).

4. Если m является бесконечностью - вернуть строку "Infinity".

5. В прочих случаях, пусть n, k и s - такие целые, что k >= 1, 10k-1<= s <10k,

Page 56: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

численное значение s * 10n-k равно m и k имеет наименьшее из возможных значений.Заметим, что k равно количеству цифр в десятичном представлении s, что s не делитсяна 10 и что младший десятичный разряд s не обязательно однозначно определяетсяэтими критериями.

6. Если k <= n <= 21 - вернуть строку, состоящую из k цифр численного представленияs (по порядку разрядов, без лишних начальных нулей), за которым следуют n k символов'0'.

7. Если 0 < n <= 21 - вернуть строку, состоящую n старших цифр десятичногопредставления s, за которыми следуют десятичная точка '. ' и оставшиеся k-n цифрдесятичного представления s.

8. Если -6 <n <= 0 - вернуть строку, состоящую из символа '0', за которыми следуютдесятичная точка '. ', -n символов '0' и k цифр десятичного представления s.

9. Иначе, если k = 1 - вернуть строку s, за которой следует символ латиницы нижнегорегистра 'e', знак плюс '+' или минус '-' (в зависимости от того, положительно n-1 илиотрицательно), за которым следует десятичное представление целого abs(n-1) (безлишних начальных нулей).

10. Вернуть строку, состоящую из старшей цифры десятичного представления s, закоторой следуют десятичная точка '. ', оставшиеся k-1цифр десятичного представленияs, за которыми следует символ латиницы нижнего регистра 'e', знак плюс '+' или минус'-' (в зависимости от того, положительно n-1 или отрицательно), за которым следуетдесятичное представление целого abs(n-1) (без лишних начальных нулей).

ЗАМЕЧАНИЕСледующие наблюдения могут служить рекомендациями для создателей реализаций, ноне являются частью нормативных требований данного Стандарта:

Если x - некоторое численное значение, не равное -0, то ToNumber(ToString(x)) вточности совпадает с значением x.

Младшая десятичная цифра s не всегда однозначно определяется требованиями шага 5.

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

В прочих случаях, пусть n, k и s - такие целые, что k >= 1, 10k-1<= s <10k, численноезначение s * 10n-k равно m и k имеет наименьшее из возможных значений. Еслисуществует несколько подходящих значений для s - выбрать из них то, для которого s* 10n-k является ближайшим к m. Если существует два таких возможных значения s -выбрать из них чётное. Заметим, что k равно количеству цифр в десятичномпредставлении s и что s не делится на 10.

Создателям реализаций ECMAScript рекомендуется изучить работу Дэвида М. Гэя попреобразованиям чисел с плавающей точкой из двоичного формата в десятичный:

Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions.Numerical Analysis Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey).November 30, 1990. Доступна по адресу http://cm.bell-labs.com/cm/cs/doc/90/4-10.ps.gz.

Page 57: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Исходные коды программ из данной работы доступны по адресам http://cm.bell-labs.com/netlib/fp/dtoa.c.gz и http://cm.bell-labs.com/netlib/fp/g_fmt.c.gz, а также наразличных сайтах-зеркалах netlib.

9.9 ToObject

Оператор ToObject ("к объекту") преобразует свой аргумент в значение типа Objectсогласно следующей таблице:

Входнойтип Результат

Undefined Бросить исключение TypeError.Null Бросить исключение TypeError.

Boolean Создать новый объект Boolean с атрибутом [[value]] равным входномубулевскому значению. Описание объектов Boolean см. в разделе 15.6.

Number Создать новый объект Number с атрибутом [[value]] равным входномучисленному значению. Описание объектов Number см. в разделе 15.7.

String Создать новый объект String с атрибутом [[value]] равным входномустроковому значению. Описание объектов String см. в разделе 15.7.

Object Результат совпадает с входным аргументом (преобразование непроизводится).

Контексты исполнения10 Контексты исполнения

Когда управление передаётся выполняемому коду на ECMAScript, осуществляется вход вконтекст исполнения. Активные контексты выполнения логически формируют стек.Верхним контекстом выполнения в этом логическом стеке является текущий контекстисполнения.

10.1 Определения10.1.1 Объекты типа Function

Существуют две разновидности объектов типа Function:

Программные функции определены в исходном тексте при помощиОбъявленияФункции или создаются динамически при помощи ВыраженияФункцииили при помощи встроенного объекта Function в качестве конструктора.Внутренние функции являются встроенными объектами языка, например parseInt иMath.exp. Конкретная реализация также может предоставлять свои специфическиевнутренние функции, не описанные в данной спецификации. Эти функции несодержат исполняемого кода, определяемого в грамматике ECMAScript, поэтомуони исключены из данного рассмотрения контекстов выполнения.

10.1.2 Типы исполняемого кода

Существует три типа исполняемого кода на ECMAScript:

Page 58: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Глобальный код - исходный текст, который обрабатывается как ПрограммаECMAScript. Глобальный код конкретной Программы не включает в себя тех частейисходного текста, которые распознаются как ТелоФункции.Eval-код - исходный текст, передаваемый во встроенную функцию eval. Точнее,если параметр встроенной функции eval является строкой, он обрабатывается какПрограмма ECMAScript. Eval-код для конкретного вызова eval является глобальнойчастью кода, переданного в строковом параметре.Код функции - исходный код, который распознаётся как часть ТелаФункции. Кодфункции для конкретного ТелаФункции не включает в себя тех частей исходноготекста, которые распознаются как части вложенных ТелФункций. Код функции такжеобозначает исходный текст, передаваемый встроенному объекту Function, когда ониспользуется в качестве конструктора. Строго говоря, последний параметр,переданный конструктору Function, преобразовывается в строку и обрабатываетсякак ТелоФункции. Если более чем один параметр передаётся конструктору Function,все параметры кроме последнего преобразовываются в строки и конкатенируютсявместе с использованием запятых в качестве разделителя. Результирующая строкаинтерпретируется как СписокФормальныхАргументов для ТелаФункции,определённого последним параметром. Код функции для конкретного экземпляраFunction не включает в себя тех частей исходного текста, которые распознаются какчасти вложенных ТелФункций.

10.1.3 Инстанциация (создание) переменных

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

Какой именно объект используется в качестве объекта переменных и какими изатрибутов обладают его свойства - зависит от типа кода, но остальная часть поведенияявляется общей. При входе в контекст выполнения свойства привязываются к объектупеременных в следующем порядке:

Для кода функции: для каждого формального аргумента, определённого вСпискеФормальныхАргументов, создать свойство объекта переменных, названиекоторого является Идентификатором и атрибуты которого определены типом кода.Значения параметров передаются вызывающим кодом как аргументы метода [[Call]].Если вызывающий код передаёт меньше параметров, чем было указано формальныхпараметров, оставшиеся формальные параметры имеют значение undefined. Еслидва или больше формальных параметра имеют одинаковое имя и, таким образом,ссылаются на одно и то же свойство, то соответствующее свойство получаетзначение, переданное для последнего параметра с таким именем. Если значениепоследнего параметра не было указано при вызове, значением свойства становитсяundefined.Для каждого ОбъявленияФункции в коде по ходу исходного текста, создатьсвойство объекта переменных с именем Идентификатора, указанного вОбъявленииФункции, значение которого является результатом создания объектаFunction, описанного в разделе 13, и атрибуты которого определяются типом кода.Если в объекте переменных уже есть свойство с таким именем, заменить егозначение и атрибуты. Семантически этот шаг должен следовать за созданиемсвойств для СпискаФормальныхАргументов.

Page 59: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Для каждого ОбъявленияПеременной или ОбъявленияПеременнойБезIn в исходномкоде, создать свойство в объекте переменных с именем Идентификатора,указанного в ОбъявленииПеременной или ОбъявленииПеременнойБезIn, значениекоторого равно undefined и атрибуты которого определяются типом кода. Если вобъекте переменных уже существует свойство с именем объявленной переменной,значение свойства и его атрибуты не изменяются. Семантически этот шаг долженследовать за созданием свойств для СпискаФормальныхАргументов иОбъявленийФункций. В частности, если имя объявляемой переменной совпадает сименем объявленной функции или формальным параметром, объявлениепеременной не влияет на существующее свойство.

10.1.4 Иерархия областей видимости и разрешение идентификаторов

Для каждого контекста выполнения имеется связанная с ним иерархия областейвидимости. Иерархия областей видимости - это список объектов, в которыхпроизводится поиск при определении значения Идентификатора. Когда управлениевходит в контекст выполнения, создаётся иерархия областей видимости и сразузаполняется начальным набором объектов, зависящим от типа кода. Во время исполнениякода в контексте исполнения на иерархию областей видимости влияют толькоинструкции with (см. раздел 12.10) и конструкции catch (см. раздел 12.14).

Во время выполнения получение значения синтаксического нетерминалаПервичноеВыражение : Идентификатор производится по следующему алгоритму:

1. Получить следующий объект в иерархии областей видимости. Если такого объекта нет,переход на шаг 5.

2. Вызвать метод [[HasProperty]] у Результата(1), передавая Идентификатор в качествеимени свойства.

3. Если Результат(2) равен true, вернуть значение типа Reference, базовым объектомкоторого является Результат(1), а именем свойства - Идентификатор.

4. Переход на шаг 1.

5. Вернуть значение типа Reference, базовым объектом которого является null, а именемсвойства - Идентификатор.

Результатом получения значения идентификатора всегда является значение типаReference, имя свойства которого совпадает с именем идентификатора.

10.1.5 Глобальный объект

Существует единственный общий глобальный объект (см. раздел 15.1), которыйсоздаётся прежде, чем управление приходит в какой-либо из контекстов выполнения.Первоначально у глобального объекта есть следующие свойства:

Встроенные объекты, такие как Math, String, Date, parseInt и т.д. Они обладаютатрибутами { DontEnum }.Дополнительные свойства, определённые средой. Они могут включать в себясвойства, значением которых является сам объект. Например, в объектной моделидокумента HTML свойство window глобального объекта представляет собой самглобальный объект.

Page 60: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Когда управление входит в контексты выполнения, по ходу исполнения кода наECMAScript к глобальному объекту могут добавляться новые свойства и меняться старые.

10.1.6 Объект активации

Когда управление входит в контекст выполнения кода функции, объект, называемыйобъектом активации, создаётся и связывается с контекстом выполнения. Объектактивации инициализируется с именем свойства arguments и атрибутами { DontDelete }.Начальным значением этого свойства является описываемый ниже объект аргументов.

Объект активации затем используется в качестве объекта переменных для инстанциациипеременных.

Объект активации является механизмом, используемым исключительно в целяхопределения спецификации. Для программы на ECMAScript невозможно получить доступк объекту активации. Она может получать доступ к полям этого объекта, но не к самомуобъекту. Когда операция вызова применяется к значению Reference, базовым объектомкоторого является объект активации, в качестве значения this в таком вызовеиспользуется null.

10.1.7 This

Для каждого активного контекста выполнения существует связанная с ним переменнаяthis. Значение this зависит от вызывающего и от типа выполняемого кода иопределяется, когда управление входит в контекст выполнения. Значение this, связанноес контекстом выполнения, является неизменяемым.

10.1.8 Объект аргументов

Когда управление входит в контекст выполнения кода функции, создаётся объектаргументов, который инициализируется следующим образом:

Значение встроенного свойства [[Prototype]] для объекта аргументов равнопервоначальному объекту-прототипу Object, т.е. тому, который представляет собойпервоначальное значение Object.prototype (см. раздел 15.2.3.1).Создаётся свойство с именем callee и атрибутами { DontEnum }. Первоначальноезначение этого свойства - объект Function, выполнение которого производится вданный момент. Это позволяет анонимным функциям быть рекурсивными.Создаётся свойство с именем length и атрибутами { DontEnum }. Начальнымзначением этого свойства является число реальных значений аргументов,переданное при вызове.Для каждого неотрицательного числа arg, меньшего значения свойства lengthсоздаётся свойство с именем ToString(arg) и атрибутом { DontEnum }. Начальнымзначением этого свойства является реальное значение соответствующего аргумента,переданное при вызове. Первое реальное значение аргумента соответствует arg = 0,второе - arg = 1 и так далее. В том случае, когда arg меньше количестваформальных параметров объекта Function, значение свойства является общим ссоответствующим свойством объекта активации. Это означает, что изменениеданного свойства изменяет соответствующее значение свойства у объекта активациии наоборот.

10.2 Вход в контекст исполнения

Page 61: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Каждый вызов функции или конструктора входит в новый контекст исполнения, дажеесли функция вызывает себя рекурсивно. Каждый возврат (return) выходит из контекстаисполнения. Брошенное исключение, если оно не поймано, тоже может выйти из одногоили более контекстов исполнения.

Когда управление входит в контекст исполнения, создаётся и инициализируетсяиерархия областей видимости, происходит инстанциация переменных и определяетсязначение this.

Инициализация иерархии областей видимости, инстанциация переменных иопределение значения this зависят от типа кода, в который производится вход.

10.2.1 Глобальный код

Создаётся иерархия областей видимости, которая после инициализации содержиттолько один глобальный объект и никаких более.Инстанциация переменных производится при помощи глобального объекта вкачестве объекта переменных, с использованием атрибутов свойств { DontDelete }.Значением this является глобальный объект .

10.2.2 Eval-код

Когда управление входит в контекст выполнения для eval-кода, для определенияиерархии областей видимости, объекта переменных и значения this используетсяпредыдущий активный контекст исполнения, называемый вызывающим контекстом. Есливызывающего контекста не существует, инициализация иерархии областей видимости,инстанциация переменных и определение значения this производятся так же, как и дляглобального кода.

Иерархия областей видимости при инициализации содержит те же объекты и в томже порядке, что и иерархия областей видимости вызывающего контекста. При этомвключаются объекты, добавленные в иерархию областей видимости вызывающегоконтекста инструкциями with и конструкциями catch.Инстанциация переменных производится при помощи объекта переменныхвызывающего контекста и пустых атрибутов свойств.Значение this совпадает со значением this для вызывающего контекста.

10.2.3 Код функции

Иерархия областей видимости при инициализации содержит объект активации, закоторым следуют объекты иерархии областей видимости, сохранённой в свойстве[[Scope]] объекта типа Function.Инстанциация переменных производится при помощи объекта активации в качествеобъекта переменных и с использованием атрибутов свойств { DontDelete }.Значение this передаётся вызывающим. Если значение this, переданноевызывающим, не является объектом (заметим, что null - не объект), то значениемthis является глобальный объект.

Выражения

Page 62: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

11 Выражения11.1 Первичные выражения

Синтаксис

ПервичноеВыражение :this ИдентификаторЛитералЛитералМассива ЛитералОбъекта (Выражение )

11.1.1 Ключевое слово this

Значением ключевого слова this является значение this текущего контекста исполнения.

11.1.2 Ссылка на идентификатор

Значение Идентификатора вычисляется согласно правилам действия областей видимости,указанным в разделе 10.1.4. Результатом получения значения Идентификатора всегдаявляется значение типа Reference.

11.1.3 Ссылка на литерал

Значение Литерала вычисляется согласно описанию в разделе 7.8.

11.1.4 Инициализатор массива

Инициализатором массива называется выражение, описывающее инициализацию объектаArray, записанное в форме литерала. Оно представляет собой заключённый в квадратныескобки список из нуля или более выражений, каждое из которых является элементоммассива. Элементы не обязательно должны быть литералами. Их значения вычисляютсякаждый раз, когда вычисляется значение инициализатора.

Элементы массива могут быть опущены в начале, середине или конце списка элементов.Если в любом месте списка элементов встречается запятая, перед которой неприсутствует ВыражениеПрисваивания (т. е. запятая в начале списка или сразу последругой запятой), пропущенный элемент массива увеличивает длину объекта Array ииндексы последующих элементов. Опущенные элементы массива являютсянеопределёнными.

Синтаксис

ЛитералМассива :[ Пропускопц ] [ СписокЭлементов ] [ СписокЭлементов , Пропускопц ]

СписокЭлементов :Пропускопц ВыражениеПрисваиванияСписокЭлементов , Пропускопц ВыражениеПрисваивания

Page 63: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Пропуск :, Пропуск ,

Семантика

Значение нетерминала ЛитералМассива : [ Пропускопц ] вычисляется по следующейсхеме:

1. Создать новый массив, как он был бы создан выражением new Array().

2. Вычислить значение Пропуска (если он отсутствует, использовать численное значениеноль).

3. Вызвать метод [[Put]] Результата(1) с аргументами "length" и Результат(2).

4. Вернуть Результат(1).

Значение нетерминала ЛитералМассива : [ СписокЭлементов ] вычисляется по следующейсхеме:

1. Вычислить значение СпискаЭлементов.

2. Вернуть Результат(1).

Значение нетерминала ЛитералМассива : [ СписокЭлементов , Пропускопц ] вычисляетсяпо следующей схеме:

1. Вычислить значение СпискаЭлементов.

2. Вычислить значение Пропуска (если он отсутствует, использовать численное значениеноль).

3. Вызвать метод [[Get]] Результата(1) с аргументом "length".

4. Вызвать метод [[Put]] Результата(1) с аргументами "length" и (Результат(2) +Результат(3)).

5. Вернуть Результат(1).

Значение нетерминала ЛитералМассива : Пропускопц ВыражениеПрисваиваниявычисляется по следующей схеме:

1. Создать новый массив, как он был бы создан выражением new Array().

2. Вычислить значение Пропуска (если он отсутствует, использовать численное значениеноль).

3. Вычислить значение ВыраженияПрисваивания.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать метод [[Put]] Результата(1) с аргументами Результат(2) и Результат(4).

Page 64: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Вернуть Результат(1)

Значение нетерминала ЛитералМассива : СписокЭлементов , ПропускопцВыражениеПрисваивания вычисляется по следующей схеме:

1. Вычислить значение СпискаЭлементов.

2. Вычислить значение Пропуска (если он отсутствует, использовать численное значениеноль).

3. Вычислить значение ВыраженияПрисваивания.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать метод [[Get]] Результата(1) с аргументом "length".

6. Вызвать метод [[Put]] Результата(1) с аргументами (Результат(2)+ Результат(5)) иРезультат(4).

7. Вернуть Результат(1)

Значение нетерминала Пропуск : , вычисляется по следующей схеме:

1. Вернуть численное значение 1.

Значение нетерминала Пропуск : Пропуск , вычисляется по следующей схеме:

1. Вычислить Пропуск.

2. Вернуть (Результат(1)+ 1).

11.1.5 Инициализатор объекта

Инициализатором объекта называется выражение, описывающее инициализациюсущности типа Object, записанное в форме литерала. Оно представляет собойзаключённый в фигурные скобки список из нуля или более названий свойств исоответствующих им значений. Значения не обязательно должны быть литералами - онивычисляются каждый раз, когда вычисляется значение инициализатора.

Синтаксис

ЛитералОбъекта :{}{ СписокИмёнСвойствИЗначений }

СписокИмёнСвойствИЗначений :ИмяСвойства : ВыражениеПрисваивания СписокИмёнСвойствИЗначений , ИмяСвойства : ВыражениеПрисваивания

ИмяСвойства :Идентификатор СтроковойЛитерал ЧисленныйЛитерал

Page 65: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Семантика

Значение нетерминала ЛитералОбъекта : {} вычисляется по следующей схеме:

1. Создать новый объект, как он был бы создан выражением new Object().

2. Вернуть Результат(1).

Значение нетерминала ЛитералОбъекта : { СписокИмёнСвойствИЗначений } вычисляетсяпо следующей схеме:

1. Вычислить значение СпискаИмёнСвойствИЗначений.

2. Вернуть Результат(1).

Значение нетерминала СписокИмёнСвойствИЗначений : ИмяСвойства :ВыражениеПрисваивания вычисляется по следующей схеме:

1. Создать новый объект, как он был бы создан выражением new Object().

2. Вычислить значение ИмениСвойства.

3. Вычислить значение ВыраженияПрисваивания.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать метод [[Put]] Результата(1) с аргументами Результат(2) и Результат(4).

6. Вернуть Результат(1).

Значение нетерминала СписокИмёнСвойствИЗначений : СписокИмёнСвойствИЗначений ,ИмяСвойства : ВыражениеПрисваивания вычисляется по следующей схеме:

1. Вычислить значение СпискаИмёнСвойствИЗначений.

2. Вычислить значение ИмениСвойства.

3. Вычислить значение ВыраженияПрисваивания.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать метод [[Put]] Результата(1) с аргументами Результат(2) и Результат(4).

6. Вернуть Результат(1).

Значение нетерминала ИмяСвойства : Идентификатор вычисляется по следующей схеме:

1. Сформировать строку, содержащую такую же последовательность символов, что иИдентификатор.

2. Вернуть Результат(1).

Значение нетерминала ИмяСвойства : СтроковойЛитерал вычисляется по следующейсхеме:

Page 66: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Вернуть значение СтроковогоЛитерала.

Значение нетерминала ИмяСвойства : ЧисловойЛитерал вычисляется по следующейсхеме:

1. Построить значение ЧисленногоЛитерала.

2. Вернуть ToString(Результат(1)).

11.1.6 Оператор группировки

Значение нетерминала ПервичноеВыражение : ( Выражение ) вычисляется по следующейсхеме:

1. Вычислить значение Выражения. Результат может иметь тип Reference.

2. Вернуть Результат(1).

ЗАМЕЧАНИЕ Вышеприведённый алгоритм не применяет ПолучитьЗначение к Результату(1). Основнойпричиной для такого поведения является обеспечение возможности применения такихоператоров как delete и typeof к выражениям в скобках.

11.2 Левосторонние выражения

Синтаксис

ВыражениеЭлемента :ПервичноеВыражение ВыражениеФункции ВыражениеЭлемента [ Выражение ] ВыражениеЭлемента . Идентификатор new ВыражениеЭлемента Аргументы

ВыражениеNew :ВыражениеЭлемента new ВыражениеNew

ВыражениеCall :ВыражениеЭлемента АргументыВыражениеCall АргументыВыражениеCall [ Выражение ] ВыражениеCall . Идентификатор

Аргументы :()( СписокАргументов )

СписокАргументов :ВыражениеПрисваивания СписокАргументов , ВыражениеПрисваивания

ЛевостороннееВыражение :

Page 67: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ВыражениеNew ВыражениеCall

11.2.1 Доступ к свойствам

Доступ к свойствам осуществляется по их имени с использованием либо точечнойнотации:

ВыражениеЭлемента . Идентификатор ВыражениеCall . Идентификатор

либо скобочной нотации:

ВыражениеЭлемента [ Выражение ] ВыражениеCall [ Выражение ]

Объяснить суть точечной нотации можно следующим синтаксическим преобразованием:

ВыражениеЭлемента . Идентификатор

идентично по своему поведению

ВыражениеЭлемента [ <строка-идентификатора> ]

и аналогично

ВыражениеCall . Идентификатор

идентично по своему поведению ВыражениюCall [ <строка-идентификатора> ]

где <строка-идентификатора> - строковой литерал, содержащий ту жепоследовательность символов, что и Идентификатор.

Значение нетерминала ВыражениеЭлемента : ВыражениеЭлемента [ Выражение ]вычисляется по следующей схеме:

1. Вычислить значение ВыраженияЭлемента.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вычислить значение Выражения.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать ToObject(Результат(2)).

6. Вызвать ToString(Результат(4)).

7. Вернуть значение типа Reference, базовым объектом которого является Результат(5), аименем свойства - Результат(6).

Значение нетерминала ВыражениеCall : ВыражениеCall [ Выражение ] вычисляетсясовершенно аналогично за исключением того, что на шаге 1 вычисляется значениевложенного ВыраженияCall.

Page 68: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

11.2.2 Оператор new

Значение нетерминала ВыражениеNew : new ВыражениеNew вычисляется по следующейсхеме:

1. Вычислить значение ВыраженияNew.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Если Тип(Результата(2)) не Object, бросить исключение TypeError.

4. Если для Результата(2) не реализован внутренний метод [[Construct]], броситьисключение TypeError.

5. Вызвать метод [[Construct]] для Результата(2), не передав ему аргументов (т.е. передавпустой список аргументов).

6. Вернуть Результат(5).

Значение нетерминала ВыражениеЭлемента : new ВыражениеЭлемента Аргументывычисляется по следующей схеме:

1. Вычислить значение ВыраженияЭлемента.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вычислить значение Аргументов, создав внутренний список значений аргументов (см.раздел 11.2.4).

4. Если Тип(Результата(2)) не Object, бросить исключение TypeError.

5. Если для Результата(2) не реализован внутренний метод [[Construct]], броситьисключение TypeError.

6. Вызвать метод [[Construct]] у Результата(2), передав список Result(3) в качествезначений аргументов.

7. Вернуть Результат(6).

11.2.3 Вызовы функций

Значение нетерминала ВыражениеCall : ВыражениеЭлемента Аргументы вычисляется последующей схеме:

1. Вычислить значение ВыраженияЭлемента.

2. Вычислить значение Аргументов, создав внутренний список значений аргументов (см.раздел 11.2.4).

3. Вызвать ПолучитьЗначение(Результат(1)).

4. Если Тип(Результата(3)) не Object - бросить исключение TypeError.

5. Если для Результата(3) не реализован внутренний метод [[Call]] - бросить исключение

Page 69: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

TypeError.

6. Если Тип(Результата(1)) - Reference, Результат(6) равен ПолучитьБазу(Результат(1)).Иначе Результат(6) равен null.

7. Если Результат(6) является объектом активации, Результат(7) равен null. ИначеРезультат(7) совпадает с Результатом(6).

8. Вызвать метод [[Call]] у Результата(3), передав Result(7) в качестве значения this исписок Result(2) в качестве значений аргументов.

9. Вернуть Результат(8).

Значение нетерминала ВыражениеCall : ВыражениеCall Аргументы вычисляетсясовершенно аналогично за исключением того, что на шаге 1 вычисляется значениевложенного ВыраженияCall.

ЗАМЕЧАНИЕРезультат(8) никогда не будет иметь тип Reference, если Результат(3) является нативнымобъектом ECMAScript. Может ли объект среды вернуть значение типа Reference - зависитот конкретной реализации.

11.2.4 Списки аргументов

В результате вычисления значения списка аргументов создаётся внутренний списокзначений (см. раздел 8.8).

Значение нетерминала Аргументы : () вычисляется по следующей схеме:

1. Вернуть пустой список значений.

Значение нетерминала Аргументы : ( СписокАргументов ) вычисляется по следующейсхеме:

1. Вычислить значение СпискаАргументов.

2. Вернуть Результат(1).

Значение нетерминала СписокАргументов : ВыражениеПрисваивания вычисляется последующей схеме:

1. Вычислить значение ВыраженияПрисваивания.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вернуть внутренний список, состоящий из единственного элемента - Результата(2).

Значение нетерминала СписокАргументов : СписокАргументов , ВыражениеПрисваиваниявычисляется по следующей схеме:

1. Вычислить значение СпискаАргументов.

2. Вычислить значение ВыраженияПрисваивания.

Page 70: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Вызвать ПолучитьЗначение(Результат(2)).

4. Вернуть внутренний список, длина которого на единицу больше, чем у Результата(1), иэлементы которого являются расположенными в том же порядке элементамиРезультата(1), за которыми следует Результат(3) в качестве последнего элемента новогосписка.

11.2.5 Выражения функций

Значение нетерминала ВыражениеЭлемента : ВыражениеФункции вычисляется последующей схеме:

1. Вычислить значение ВыраженияФункции.

2. Вернуть Результат(1).

11.3 Постфиксные выражения

Синтаксис

ПостфиксноеВыражение :ЛевостороннееВыражение ЛевостороннееВыражение [здесь нет КонцаСтроки] ++ ЛевостороннееВыражение [здесь нет КонцаСтроки] --

11.3.1 Постфиксный оператор инкремента

Значение нетерминала ПостфиксноеВыражение : ЛевостороннееВыражение [здесь нетКонцаСтроки] ++ вычисляется по следующей схеме:

1. Вычислить значение ЛевостороннегоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToNumber(Результат(2)).

4. Прибавить значение 1 к Результату(3) согласно тем же правилам, что и для оператора +(см. раздел 11.6.3).

5. Вызвать ЗаписатьЗначение(Результат(1), Результат(4)).

6. Вернуть Результат(3).

11.3.2 Постфиксный оператор декремента

Значение нетерминала ПостфиксноеВыражение : ЛевостороннееВыражение [здесь нетКонцаСтроки] -- вычисляется по следующей схеме:

1. Вычислить значение ЛевостороннегоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToNumber(Результат(2)).

Page 71: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

4. Вычесть значение 1 из Результата(3) согласно тем же правилам, что и для оператора -(см. раздел 11.6.3).

5. Вызвать ЗаписатьЗначение(Результат(1), Результат(4)).

6. Вернуть Результат(3).

11.4 Унарные операторы

Синтаксис

УнарноеВыражение :ПостфиксноеВыражение delete УнарноеВыражение void УнарноеВыражение typeof УнарноеВыражение ++ УнарноеВыражение -- УнарноеВыражение + УнарноеВыражение - УнарноеВыражение ~ УнарноеВыражение ! УнарноеВыражение

11.4.1 Оператор delete

Значение нетерминала УнарноеВыражение : delete УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Если Тип(Результата(1)) не Reference - вернуть true.

3. Вызвать ПолучитьБазу(Результат(1)).

4. Вызвать ПолучитьИмяСвойства(Результат(1)).

5. Вызвать метод [[Delete]] для Результата(3), передав Результат(4) в качестве именисвойства, подлежащего удалению.

6. Вернуть Результат(5).

11.4.2 Оператор void

Значение нетерминала УнарноеВыражение : void УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вернуть undefined.

11.4.3 Оператор typeof

Page 72: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала УнарноеВыражение : typeof УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Если Тип(Результата(1)) не Reference - переход на шаг 4.

3. Если ПолучитьБазу(Результата(1)) равно null - вернуть "undefined".

4. Вызвать ПолучитьЗначение(Результат(1)).

5. Вернуть строку, определяемую Типом(Результата(4)) согласно следующей таблице:

Тип РезультатUndefined "undefined"

Null "object"

Boolean "boolean"

Number "number"

String "string"

Object (нативный и не имеет реализации [[Call]]) "object"Object (нативный и имеет реализацию [[Call]]) "function"

Object (среды выполнения) зависит от конкретной реализации11.4.4 Префиксный оператор инкремента

Значение нетерминала УнарноеВыражение : ++ УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToNumber(Результат(2)).

4. Прибавить значение 1 к Результату(3) согласно тем же правилам, что и для оператора +(см. раздел 11.6.3).

5. Вызвать ЗаписатьЗначение(Результат(1), Результат(4)).

6. Вернуть Результат(4).

11.4.5 Префиксный оператор декремента

Значение нетерминала УнарноеВыражение : -- УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToNumber(Результат(2)).

4. Вычесть значение 1 из Результата(3), используя те же правила, что и для оператора -

Page 73: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

(см. раздел 11.6.3).

5. Вызвать ЗаписатьЗначение(Результат(1), Результат(4)).

6. Вернуть Результат(4).

11.4.6 Унарный оператор +

Унарный оператор + преобразует свой операнд к типу Number.

Значение нетерминала УнарноеВыражение : + УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToNumber(Результат(2)).

4. Вернуть Результат(3).

11.4.7 Унарный оператор -

Унарный оператор - преобразует свой операнд к типу Number и меняет его знак напротивоположный. Заметим, что смена знака для +0 даёт -0, а смена знака для -0 даёт+0.

Значение нетерминала УнарноеВыражение : - УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToNumber(Результат(2)).

4. Если Результат(3) равен NaN - вернуть NaN.

5. Изменить знак(3), т.е. вычислить число с таким же значением модуля, но спротивоположным знаком.

6. Вернуть Результат(5).

11.4.8 Побитовый оператор НЕ ( ~ )

Значение нетерминала УнарноеВыражение : ~ УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToInt32(Результат(2)).

4. Вычислить побитовое дополнение к Результату(3). Результатом является знаковое 32-

Page 74: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

битное целое число.

5. Вернуть Результат(4).

11.4.9 Логический оператор НЕ (! )

Значение нетерминала УнарноеВыражение : ! УнарноеВыражение вычисляется последующей схеме:

1. Вычислить значение УнарногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToBoolean(Результат(2)).

4. Если Результат(3) равен true - вернуть false.

5. Вернуть true.

11.5 Мультипликативные операторы

Синтаксис

МультипликативноеВыражение :УнарноеВыражениеМультипликативноеВыражение * УнарноеВыражение МультипликативноеВыражение / УнарноеВыражение МультипликативноеВыражение % УнарноеВыражение

Семантика

Значение нетерминала МультипликативноеВыражение : МультипликативноеВыражение @УнарноеВыражение, где @ заменяет один из операторов в вышеперечисленныхопределениях, вычисляется по следующей схеме:

1. Вычислить значение МультипликативногоВыражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вычислить значение УнарногоВыражения.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Вызвать ToNumber(Результат(2)).

6. Вызвать ToNumber(Результат(4)).

7.Применить указанную операцию (*, /, или %) к Результату(5) и Результату(6). См.замечания ниже (разделы 11.5.1, 11.5.2, 11.5.3).

8.Вернуть Результат(7).

11.5.1 Действие оператора *

Page 75: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Оператор * производит умножение, генерируя произведение своих операндов.Умножение коммутативно. Умножение в ECMAScript не всегда ассоциативно вследствиеконечной точности вычислений.

Результат произведения чисел с плавающей точкой соответствует правилам арифметикидвойной точности стандарта IEEE 754:

Если хотя бы один из операндов равен NaN, результат равен NaN.Знак результата положителен, если знаки операндов совпадают, и отрицателен,если знаки операндов различны.Умножение бесконечности на ноль даёт NaN.Умножение бесконечности на бесконечность даёт бесконечность. Знак определяетсяпо приведённому выше правилу.Произведение бесконечности на конечное ненулевое значение даёт знаковуюбесконечность. Знак определяется по приведённому выше правилу.В оставшихся случаях, когда среди операндов не встречаются ни бесконечность, ниNaN, произведение вычисляется и округляется к ближайшему представимомузначению согласно режиму IEEE "округлить-к-ближайшему". Если модуль числаслишком велик и не может быть представлен, то результатом являетсябесконечность соответствующего знака. Если модуль числа слишком мал и не можетбыть представлен, то результатом является ноль соответствующего знака. ЯзыкECMAScript требует поддержки "постепенного недополнения" согласно стандартуIEEE 754.

11.5.2 Действие оператора /

Оператор / производит деление, генерируя частное своих операндов. Левый операндявляется делимым, а правый - делителем. ECMAScript не производит целочисленногоделения. Операнды и результат деления являются вещественными числами с плавающейточкой двойной точности. Результат деления определён спецификацией арифметикистандарта IEEE 754:

Если хотя бы один из операндов равен NaN, результат равен NaN.Знак результата положителен, если знаки операндов совпадают, и отрицателен,если знаки операндов различны.Деление бесконечности на бесконечность даёт NaN.Деление бесконечности на ноль даёт бесконечность. Знак определяется поприведённому выше правилу.Деление бесконечности на конечное ненулевое значение даёт знаковуюбесконечность. Знак определяется по приведённому выше правилу.Деление конечного значения на бесконечность даёт ноль. Знак определяется поприведённому выше правилу.Деление нуля на ноль даёт NaN, деление нуля на любое другое конечное значениедаёт ноль, знак которого определяется по приведённому выше правилу.Деление ненулевого конечного значения на ноль даёт знаковую бесконечность. Знакопределяется по приведённому выше правилу.В оставшихся случаях, когда среди операндов не встречаются ни бесконечность, ниноль, ни NaN, частное вычисляется и округляется к ближайшему представимомузначению согласно режиму IEEE "округлить-к-ближайшему". Если модуль числаслишком велик и не может быть представлен, происходит переполнение ирезультатом является бесконечность соответствующего знака. Если модуль числаслишком мал и не может быть представлен, происходит недополнение (потеря

Page 76: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

точности) и результатом является ноль соответствующего знака. Язык ECMAScriptтребует поддержки "постепенного недополнения" согласно стандарту IEEE 754.

11.5.3 Действие оператора %

Оператор % возвращает остаток от подразумеваемого деления своих операндов. Левыйоперанд является делимым, а правый - делителем.

ЗАМЕЧАНИЕВ языках C и C++ оператор получения остатка принимает только целые операнды. Но вязыке ECMAScript он также принимает числа с плавающей точкой.

Результат операции получения остатка для чисел с плавающей точкой при помощиоператора % отличается от операции "остаток", определённой в IEEE 754. Операция"остаток" в IEEE 754 вычисляет остаток от округляющего, а не отбрасывающего деления,и, таким образом, её поведение не является аналогичным обычной операции взятияцелочисленного остатка. Вместо этого язык ECMAScript определяет операцию % для чиселс плавающей точкой, которая по поведению аналогична операции взятияцелочисленного остатка в языке Java. Также она является аналогичной функции fmod изстандартной библиотеки C.

Результат получения остатка для чисел с плавающей запятой в ECMAScript определяетсяправилами арифметики IEEE:

Если хотя бы один из операндов равен NaN, результат равен NaN.Знак результата совпадает со знаком делимого.Если делимое равно бесконечности и/или делитель равен нулю, то результатомявляется NaN.Если делимое конечно, а делитель бесконечен - результат равен делимому.Если делимое равно нулю, а делитель конечен - результат равен делимому.В остальных случаях, когда среди операторов не встречаются ни бесконечность, ниноль, ни NaN, остаток с плавающей запятой r для делимого n и делителя dопределяется математическим отношением r = n (d *q), где q является целымчислом, которое отрицательно, только когда n/d отрицательно и положительно,только когда n/ d положительно, и модуль которого является наибольшим числом,не превышающим модуль точного математического частного чисел n и d.

11.6 Синтаксис аддитивных операторов

АддитивноеВыражение :МультипликативноеВыражение АддитивноеВыражение + МультипликативноеВыражение АддитивноеВыражение - МультипликативноеВыражение

11.6.1 Оператор сложения ( + )

Оператор сложения производит либо конкатенацию строк, либо численное сложение.

Значение нетерминала АддитивноеВыражение : АддитивноеВыражение +МультипликативноеВыражение вычисляется по следующей схеме:

1. Вычислить значение АддитивногоВыражения.

Page 77: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение МультипликативногоВыражения.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Вызвать ToPrimitive(Результат(2)).

6.Вызвать ToPrimitive(Результат(4)).

7.Если Тип(Результат(5)) равен String или Тип(Результат(6)) равен String - переход на шаг12. (Заметим, что этот шаг отличается от шага 3 в алгоритме сравнения для операторовотношения тем, что в нём используется или вместо и.)

8. Вызвать ToNumber(Результат(5)).

9. Вызвать ToNumber(Результат(6)).

10. Применить операцию сложения к Результату(8) и Результату(9). См. замечание ниже(раздел 11.6.3).

11. Вернуть Результат(10).

12. Вызвать ToString(Результат(5)).

13. Вызвать ToString(Результат(6)).

14. Конкатенировать Результат(12) с результатом Результатом(13).

15. Вернуть Результат(14).

ЗАМЕЧАНИЕДля вызовов ToPrimitive на шагах 5 и 6 не указывается параметр-подсказка. Всенативные объекты ECMAScript кроме Date обрабатывают отсутствие подсказки так, какбудто была передана подсказка Number. Объекты Date обрабатывают отсутствиеподсказки так, как будто была передана подсказка String. Объекты среды могутобрабатывать отсутствие подсказки каким-либо другим образом.

11.6.2 Оператор вычитания ( - )

Значение нетерминала АддитивноеВыражение : АддитивноеВыражение -МультипликативноеВыражение вычисляется по следующей схеме:

1. Вычислить значение АддитивногоВыражения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение МультипликативногоВыражения.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Вызвать ToNumber(Результат(2)).

6. Вызвать ToNumber(Результат(4)).

Page 78: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7. Применить операцию вычитания к Результату(5) и Результату(6). См. замечание ниже(раздел 11.6.3).

8.Вернуть Результат(7).

11.6.3 Действие аддитивных операторов ( +,- ) в применении к объектам типа Number

Оператор +, применённый к двум операндам численного типа, производит сложение ивозвращает сумму операндов. Оператор - производит вычитание и возвращает разностьсвоих численных операндов.

Сложение - коммутативная операция, но не всегда ассоциативная.

Результат сложения чисел с плавающей точкой соответствует правилам арифметикидвойной точности стандарта IEEE 754:

Если хотя бы один из операндов равен NaN, результат равен NaN.Сумма двух бесконечностей с противоположными знаками равна NaN.Сумма двух бесконечностей с одним знаком равна бесконечности с тем же знаком.Сумма бесконечности и конечного значения равна операнду с бесконечнымзначением.Сумма двух отрицательных нулей равна -0. Сумма двух положительных нулей илинулей с разными знаками равна +0.Сумма нуля и ненулевого конечного значения равна ненулевому операнду.Сумма двух ненулевых конечных значений с противоположными знаками равна +0.В оставшихся случаях, когда среди операндов не встречаются ни бесконечность, ниноль, ни NaN и операнды имеют либо разные модули, либо одинаковые знаки,сумма вычисляется и округляется к ближайшему представимому значению согласнорежиму IEEE "округлить-к-ближайшему". Если модуль числа слишком велик и неможет быть представлен, происходит переполнение и результатом являетсябесконечность соответствующего знака. Язык ECMAScript требует поддержки"постепенного недополнения" согласно стандарту IEEE 754.

Оператор + применённый к двум операндам численного типа, производит вычитание ивозвращает разность операндов. Левый операнд является уменьшаемым, правый -вычитаемым. Для численных операндов a и b значения выражений a- b и a+(- b) всегдаравны.

11.7 Операторы побитового сдвига

Синтаксис

ВыражениеСдвига :АддитивноеВыражение ВыражениеСдвига << ВыражениеСдвига ВыражениеСдвига >> АддитивноеВыражение ВыражениеСдвига >>> АддитивноеВыражение

11.7.1 Оператор сдвига влево ( << )

Производит операцию побитового сдвига влево на левом операнде, сдвигая его наколичество бит, указанное в правом операнде.

Page 79: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ВыражениеСдвига : ВыражениеСдвига << АддитивноеВыражениевычисляется по следующей схеме:

1. Вычислить значение ВыраженияСдвига.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение АддитивногоВыражения.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать ToInt32(Результат(2)).

6. Вызвать ToUint32(Результат(4)).

7.Отбросить все биты Результата(6) кроме 5 младших, т.е. вычислить Результат(6) & 0x1F.

8. Сдвинуть Результат(5) влево на (7) бит. Результатом является знаковое 32-битноецелое число.

9. Вернуть Результат(8).

11.7.2 Оператор знакового сдвига вправо ( >> )

Производит операцию побитового сдвига вправо с дополнением знака на левомоперанде, сдвигая его на количество бит, указанное в правом операнде.

Значение нетерминала ВыражениеСдвига : ВыражениеСдвига >> АддитивноеВыражениевычисляется по следующей схеме:

1. Вычислить значение ВыраженияСдвига.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение АддитивногоВыражения.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать ToInt32(Результат(2)).

6. Вызвать ToUint32(Результат(4)).

7.Отбросить все биты Результата(6) кроме 5 младших, т.е. вычислить Результат(6) & 0x1F.

8. Сдвинуть Результат(5) вправо на (7) бит с дополнением знака. Значение старшего битакопируется в "освободившиеся" старшие разряды. Результатом является знаковое 32-битное целое число.

9. Вернуть Результат(8).

11.7.3 Оператор беззнакового сдвига вправо ( >> )

Производит операцию побитового сдвига вправо с дополнением нулём на левомоперанде, сдвигая его на количество бит, указанное в правом операнде.

Page 80: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ВыражениеСдвига : ВыражениеСдвига >>> АддитивноеВыражениевычисляется по следующей схеме:

1. Вычислить значение ВыраженияСдвига.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение АддитивногоВыражения.

4. Вызвать ПолучитьЗначение(Результат(3)).

5. Вызвать ToUint32(Результат(2)).

6. Вызвать ToUint32(Результат(4)).

7.Отбросить все биты Результата(6) кроме 5 младших, т.е. вычислить Результат(6) & 0x1F.

8. Сдвинуть Результат(5) вправо на (7) бит с расширением знака. "Освободившиеся"старшие разряды заполняются нулями. Результатом является беззнаковое 32-битноецелое число.

9. Вернуть Результат(8).

11.8 Операторы отношения

Синтаксис

ВыражениеОтношения :ВыражениеСдвига ВыражениеОтношения < ВыражениеСдвига ВыражениеОтношения > ВыражениеСдвига ВыражениеОтношения <= ВыражениеСдвига ВыражениеОтношения >= ВыражениеСдвига ВыражениеОтношения instanceof ВыражениеСдвига ВыражениеОтношения in ВыражениеСдвига

ВыражениеОтношенияБезIn :ВыражениеСдвига ВыражениеОтношенияБезIn < ВыражениеСдвига ВыражениеОтношенияБезIn > ВыражениеСдвига ВыражениеОтношенияБезIn <= ВыражениеСдвига ВыражениеОтношенияБезIn >= ВыражениеСдвига ВыражениеОтношенияБезIn instanceof ВыражениеСдвига

ЗАМЕЧАНИЕВарианты 'БезIn' нужны для избежания путаницы между оператором in в выраженияхотношения и оператором in в инструкции for.

Семантика

Результат вычисления значения оператора отношения всегда имеет тип Boolean иобозначает, существует ли определяемое оператором отношение между двумяоперандами

Page 81: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значения нетерминалов ВыражениеОтношенияБезIn вычисляются по той же схеме, что идля нетерминалов ВыражениеОтношения за исключением того, что значение вложенногоВыраженияОтношенияБезIn вычисляется вместо вложенного ВыраженияОтношения.

11.8.1 Оператор меньше-чем ( < )

Значение нетерминала ВыражениеОтношения : ВыражениеОтношения < ВыражениеСдвигавычисляется по следующей схеме:

1. Вычислить значение ВыраженияОтношения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияСдвига.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Произвести сравнение Результат(2) < Результат(4) (см. раздел 11.8.5).

6. Если Результат(5) равен undefined - вернуть false. Иначе вернуть Результат(5).

11.8.2 Оператор больше-чем ( > )

Значение нетерминала ВыражениеОтношения : ВыражениеОтношения > ВыражениеСдвигавычисляется по следующей схеме:

1. Вычислить значение ВыраженияОтношения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияСдвига.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Произвести сравнение Результат(4) < Результат(2) (см. раздел 11.8.5).

6. Если Результат(5) равен undefined - вернуть false. Иначе вернуть Результат(5).

11.8.3 Оператор меньше или равно ( <= )

Значение нетерминала ВыражениеОтношения : ВыражениеОтношения <=ВыражениеСдвига вычисляется по следующей схеме:

1. Вычислить значение ВыраженияОтношения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияСдвига.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Произвести сравнение Результат(4) < Результат(2) (см. раздел 11.8.5).

6. Если Результат(5) равен true или undefined - вернуть false. Иначе вернуть true.

Page 82: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

11.8.4 Оператор больше-или-равно ( >= )

Значение нетерминала ВыражениеОтношения : ВыражениеОтношения >=ВыражениеСдвига вычисляется по следующей схеме:

1. Вычислить значение ВыраженияОтношения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияСдвига.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Произвести сравнение Результат(2) < Результат(4) (см. раздел 11.8.5).

6. Если Результат(5) равен true или undefined - вернуть false. Иначе вернуть true.

11.8.5 Абстрактный алгоритм сравнения для отношений

Сравнение x < y, где x и y являются значениями, возвращает true, false или undefined(последнее означает, что хотя бы один из операндов равен NaN). Такое сравнениепроизводится следующим образом:

1. Вызвать ToPrimitive(x, подсказка Number).

2. Вызвать ToPrimitive(y, подсказка Number).

3. Если Тип(Результата(1)) равен String и Тип(Результата(2)) равен String - переход на шаг16. (Заметим, что этот шаг отличается от шага 7 в алгоритме для оператора сложения +тем, что в нём используется и вместо или.)

4. Вызвать ToNumber(Результат(1)).

5. Вызвать ToNumber(Результат(2)).

6. Если Результат(4) равен NaN - вернуть undefined.

7. Если Результат(5) равен NaN - вернуть undefined.

8. Если Результат(4) и Результат(5) являются одинаковыми числовыми значениями -вернуть false.

9. Если Результат(4) равен +0 и Результат(5) равен -0 - вернуть false.

10. Если Результат(4) равен -0 и Результат(5) равен +0 - вернуть false.

11. Если Результат(4) равен +∞, вернуть false.

12. Если Результат(5) равен +∞, вернуть true.

13. Если Результат(5) равен -∞, вернуть false.

14. Если Результат(4) равен -∞, вернуть true.

15. Если математическое значение Результата (4) меньше, чем математическое значение

Page 83: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Результата(5) (заметим, что эти математические значения оба конечны и не равны нулю) -вернуть true. Иначе вернуть false.

16. Если Результат(2) является префиксом Результата(1), вернуть false. (Строковоезначение p является префиксом строкового значения q, если q может быть результатомконкатенации p и некоторой другой строки r. Отметим, что каждая строка являетсясвоим префиксом, т.к. r может быть пустой строкой.)

17. Если Результат(1) является префиксом Результата(2), вернуть true.

18. Пусть k - наименьшее неотрицательное число такое, что символ на позиции kРезультата(1) отличается от символа на позиции k Результата(2). (Такое k должносуществовать, т.к. на данном шаге установлено, что ни одна из строк не являетсяпрефиксом другой.)

19. Пусть m - целое, равное юникодному коду символа на позиции k строкиРезультат(1).

20. Пусть n - целое, равное юникодному коду символа на позиции k строки Результат(2).

21. Если m < n, вернуть true. Иначе вернуть false.

ЗАМЕЧАНИЕСравнение строк использует простой лексикографический порядок дляпоследовательностей значений кодовых точек. Не предпринимается попытокиспользования более сложных, семантически ориентированных определений равенствастрок или символов и схем упорядочения строк, описанных в спецификации Юникода.Таким образом, строки, которые являются канонически эквивалентными согласностандарту Юникода, могут быть признаны неравными в ECMAScript. По сути, данныйалгоритм предполагает, что строки уже находятся в нормализованной форме.

11.8.6 Оператор instanceof

Значение нетерминала ВыражениеОтношения: ВыражениеОтношения instanceofВыражениеСдвига вычисляется по следующей схеме:

1. Вычислить значение ВыраженияОтношения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияСдвига.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Если Результат(4) не является объектом, бросить исключение TypeError.

6. Если для Результата(4) не реализован метод [[HasInstance]], бросить исключениеTypeError.

7. Вызвать метод [[HasInstance]] Результата(4) с параметром Результат(2).

8.Вернуть Результат(7).

11.8.7 Оператор in

Page 84: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ВыражениеОтношения : ВыражениеОтношения inВыражениеСдвига вычисляется по следующей схеме:

1. Вычислить значение ВыраженияОтношения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияСдвига.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Если Результат(4) не является объектом, бросить исключение TypeError.

6. Вызвать ToString(Результат(2)).

7. Вызвать метод [[HasProperty]] Результата(4) с параметром Результат(6).

8.Вернуть Результат(7).

11.9 Операторы равенства

Синтаксис

ВыражениеРавенства :ВыражениеОтношения ВыражениеРавенства == ВыражениеОтношения ВыражениеРавенства != ВыражениеОтношения ВыражениеРавенства === ВыражениеОтношения ВыражениеРавенства !== ВыражениеОтношения

ВыражениеРавенстваБезIn :ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn == ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn != ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn === ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn !== ВыражениеОтношенияБезIn

Семантика

Результат вычисления значения оператора равенства всегда имеет тип Boolean иобозначает, существует ли определяемое оператором отношение между двумяоперандами.

Значения нетерминалов ВыражениеРавенстваБезIn вычисляются по той же схеме, что идля нетерминалов ВыражениеРавенства за исключением того, что значения вложенныхВыраженияРавенстваБезIn и ВыражениеОтношенияБезIn вычисляются соответственновместо вложенных ВыраженияРавенства и ВыраженияОтношения.

11.9.1 Оператор равенства ( == )

Значение нетерминала ВыражениеРавенства : ВыражениеРавенства ==ВыражениеОтношения вычисляется по следующей схеме:

Page 85: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Вычислить ВыражениеРавенства.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияОтношения.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Выполнить сравнение Результат(4) == Результат(2) (см. раздел 11.9.3).

6. Вернуть Результат(5).

11.9.2 Оператор не-равно ( != )

Значение нетерминала ВыражениеРавенства : ВыражениеРавенства !=ВыражениеОтношения вычисляется по следующей схеме:

1. Вычислить ВыражениеРавенства.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияОтношения.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Выполнить сравнение Результат(4) == Результат(2) (см. раздел 11.9.3).

6. Если Результат(5) равен true - вернуть false. Иначе вернуть true.

11.9.3 Абстрактный алгоритм сравнения для равенств

Сравнение x == y, где x и y являются значениями, возвращает true или false. Такоесравнение производится следующим образом:

1. Если Тип(x) отличается от Типа(y) - переход на шаг 14.

2. Если Тип(x) равен Undefined - вернуть true.

3. Если Тип(x) равен Null - вернуть true.

4. Если Тип(x) не равен Number - переход на шаг 11.

5. Если x является NaN - вернуть false.

6. Если y является NaN - вернуть false.

7. Если x является таким же числовым значением, что и y, - вернуть true.

8. Если x равен +0, а y равен -0, вернуть true.

9. 8. Если x равен -0, а y равен +0, вернуть true.

10. Вернуть false.

11. Если Тип(x) равен String - вернуть true, если x и y являются в точности одинаковыми

Page 86: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

последовательностями символов (имеют одинаковую длину и одинаковые символы всоответствующих позициях). Иначе вернуть false.

12. Если Тип(x) равен Boolean, вернуть true, если x и y оба равны true или оба равныfalse. Иначе вернуть false.

13. Вернуть true, если x и y ссылаются на один и тот же объект или они ссылаются наобъекты, которые были объединены вместе (см. раздел 13.1.2). Иначе вернуть false.

14. Если x равно null, а y равно undefined - вернуть true.

15. Если x равно undefined, а y равно null - вернуть true.

16. Если Тип(x) равен Number, а Тип(y) равен String, вернуть результат сравнения x ==ToNumber(y).

17. Если Тип(x) равен String, а Тип(y) равен Number, вернуть результат сравненияToNumber(x)== y.

18. Если Тип(x) равен Boolean, вернуть результат сравнения ToNumber(x)== y.

19. Если Тип(y) равен Boolean, вернуть результат сравнения x == ToNumber(y).

20. Если Тип(x) - String или Number, а Тип(y) - Object, вернуть результат сравнения x ==ToPrimitive(y).

21. Если Тип(x) - Object, а Тип(y) - String или Number, вернуть результат сравненияToPrimitive(x)== y.

22. Вернуть false.

ЗАМЕЧАНИЕДля вышеприведённого определения равенства:

Сравнение можно принудительно сделать строковым: ""+a ==""+ b.

Сравнение можно принудительно сделать численным: a -0 ==b -0.

Сравнение можно принудительно сделать булевским: !a == !b.

Для операторов равенства сохраняются следующие инварианты:

A != B эквивалентно !(A == B).

A == B эквивалентно B == A за исключением порядка вычисления значений A и B.

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

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

Page 87: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

упорядочения строк, описанных в спецификации Юникода версии 2.0. Таким образом,строки, которые являются канонически эквивалентными согласно стандарту Юникода,могут быть признаны не равными в ECMAScript. По сути, данный алгоритм предполагает,что строки уже находятся в нормализованной форме.

11.9.4 Оператор строгого равенства ( === )

Значение нетерминала ВыражениеРавенства : ВыражениеРавенства ===ВыражениеОтношения вычисляется по следующей схеме:

1. Вычислить ВыражениеРавенства.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияОтношения.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Выполнить сравнение Результат(4) === Результат(2) (См. ниже.)

6. Вернуть Результат(5).

11.9.5 Оператор строгого неравенства ( !== )

Значение нетерминала ВыражениеРавенства : ВыражениеРавенства !==ВыражениеРавенства вычисляется по следующей схеме:

1. Вычислить ВыражениеРавенства.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияОтношения.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Выполнить сравнение Результат(4) === Результат(2) (См. ниже.)

6. Если Результат(5) равен true - вернуть false. Иначе вернуть true.

11.9.6 Алгоритм сравнения строгого равенства

Сравнение x === y, где x и y являются значениями, возвращает true или false. Такоесравнение производится следующим образом:

1. Если Тип(x) отличается от Типа(y), вернуть false.

2. Если Тип(x) равен Undefined - вернуть true.

3. Если Тип(x) равен Null - вернуть true.

4. Если Тип(x) не равен Number - переход на шаг 11.

5. Если x является NaN - вернуть false.

6. Если y является NaN - вернуть false.

Page 88: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7. Если x является таким же числовым значением, что и y, - вернуть true.

8. Если x равен +0, а y равен -0 - вернуть true.

9. Если x равен -0, а y равен +0 - вернуть true.

10. Вернуть false.

11. Если Тип(x) равен String - вернуть true, если x и y являются в точности одинаковымипоследовательностями символов (имеют одинаковую длину и одинаковые символы всоответствующих позициях). Иначе вернуть false.

12. Если Тип(x) равен Boolean, вернуть true, если x и y оба равны true или оба равныfalse. Иначе вернуть false.

13. Вернуть true, если x и y ссылаются на один и тот же объект или они ссылаются наобъекты, которые были объединены вместе (см. раздел 13.1.2). Иначе вернуть false.

11.10 Двоичные побитовые операторы

Синтаксис

ВыражениеПобитовогоИ :ВыражениеРавенства ВыражениеПобитовогоИ & ВыражениеРавенства

ВыражениеПобитовогоИБезIn :ВыражениеРавенстваБезIn ВыражениеПобитовогоИБезIn & ВыражениеРавенстваБезIn

ВыражениеПобитовогоИскИЛИ :ВыражениеПобитовогоИ ВыражениеПобитовогоИскИЛИ ^ ВыражениеПобитовогоИ

ВыражениеПобитовогоИскИЛИБезIn :ВыражениеПобитовогоИБезIn ВыражениеПобитовогоИскИЛИБезIn ^ ВыражениеПобитовогоИБезIn

ВыражениеПобитовогоИЛИ :ВыражениеПобитовогоИскИЛИ ВыражениеПобитовогоИЛИ | ВыражениеПобитовогоИскИЛИ

ВыражениеПобитовогоИЛИБезIn :ВыражениеПобитовогоИскИЛИБезIn ВыражениеПобитовогоИЛИБезIn | ВыражениеПобитовогоИскИЛИБезIn

Семантика

Значение нетерминала A : A @B, где @ - один из побитовых операторов ввышеперечисленных правилах, вычисляется следующим образом:

1. Вычислить значение A.

Page 89: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение B.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Вызвать ToInt32(Результат(2)).

6. Вызвать ToInt32(Результат(4)).

7. Применить побитовый оператор @ к Результату(5) и Результату(6). Результатомявляется знаковое 32-битное целое число.

8.Вернуть Результат(7).

11.11 Бинарные логические операторы

Синтаксис

ВыражениеЛогическогоИ :ВыражениеПобитовогоИЛИ ВыражениеЛогическогоИ && ВыражениеПобитовогоИЛИ

ВыражениеЛогическогоИБезIn :ВыражениеПобитовогоИЛИБезIn ВыражениеЛогическогоИБезIn && ВыражениеПобитовогоИЛИБезIn

ВыражениеЛогическогоИЛИ :ВыражениеЛогическогоИ ВыражениеЛогическогоИЛИ || ВыражениеЛогическогоИ

ВыражениеЛогическогоИЛИБезIn :ВыражениеЛогическогоИБезIn ВыражениеЛогическогоИЛИБезIn || ВыражениеЛогическогоИБезIn

Семантика

Значение нетерминала ВыражениеЛогическогоИ : ВыражениеЛогическогоИ &&ВыражениеПобитовогоИЛИ вычисляется по следующей схеме:

1. Вычислить значение ВыраженияЛогическогоИ.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вызвать ToBoolean(Результат(2)).

4. Если Результат(3) равен false - вернуть Результат(2).

5. Вычислить значение ВыраженияПобитовогоИЛИ.

6. Вызвать ПолучитьЗначение(Результата(5)).

7. Вернуть Результат(6).

Page 90: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ВыражениеЛогическогоИЛИ : ВыражениеЛогическогоИЛИ ||ВыражениеЛогическогоИ вычисляется по следующей схеме:

1. Вычислить значение ВыраженияЛогическогоИЛИ.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вызвать ToBoolean(Результат(2)).

4. Если Результат(3) равен true - вернуть Результат(2).

5. Вычислить значение ВыраженияЛогическогоИ.

6. Вызвать ПолучитьЗначение(Результата(5)).

7. Вернуть Результат(6).

Значения нетерминалов ВыражениеЛогическогоИБезIn и ВыражениеЛогическогоИЛИБезInвычисляются по той же схеме, что и для нетерминалов ВыражениеЛогическогоИ иВыражениеЛогическогоИЛИ за исключением того, что значение вложенныхВыраженияЛогическогоИБезIn, ВыраженияПобитовогоИЛИБезIn иВыраженияЛогическогоИЛИБезIn вычисляются соответственно вместо вложенныхВыраженияЛогическогоИ, ВыраженияПобитовогоИЛИ и ВыраженияЛогическогоИЛИ.

ЗАМЕЧАНИЕЗначения, возвращаемые операторами && и ||, не обязательно имеют тип Boolean.Возвращаемое значение всегда будет иметь тип одного из двух выражений-операндов.

11.12 Условный оператор ( ?: )

Синтаксис

УсловноеВыражение :ВыражениеЛогическогоИЛИ ВыражениеЛогическогоИЛИ ? ВыражениеПрисваивания : ВыражениеПрисваивания

УсловноеВыражениеБезIn :ВыражениеЛогическогоИЛИБезIn ВыражениеЛогическогоИЛИБезIn ? ВыражениеПрисваивания :ВыражениеПрисваиванияБезIn

Семантика

Значение нетерминала УсловноеВыражение : ВыражениеЛогическогоИЛИ ?ВыражениеПрисваивания : ВыражениеПрисваивания вычисляется по следующей схеме:

1. Вычислить значение ВыраженияЛогическогоИЛИ.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вызвать ToBoolean(Результат(2)).

4. Если Результат(3) равен false - переход на шаг 8.

Page 91: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

5. Вычислить значение первого ВыраженияПрисваивания.

6. Вызвать ПолучитьЗначение(Результата(5)).

7. Вернуть Результат(6).

8. Вычислить значение второго ВыраженияПрисваивания.

9. Вызвать ПолучитьЗначение(Результата(8)).

10. Вернуть Результат(9).

Значение нетерминала УсловноеВыражениеБезIn вычисляется по той же схеме, что и длянетерминала УсловноеВыражение за исключением того, что значения вложенныхВыраженияЛогическогоИЛИБезIn, ВыраженияПрисваивания, иВыраженияПрисваиванияБезIn вычисляются соответственно вместо вложенныхВыраженияЛогическогоИЛИ, первого ВыраженияПрисваивания и второгоВыраженияПрисваивания.

ЗАМЕЧАНИЕГрамматика для УсловногоВыражения в ECMAScript немного отличается от таковой вязыках C и Java, которые позволяют второму выражению быть Выражением, но требуют,чтобы третье выражение было УсловнымВаражением. Такое отличие было введено вECMAScript, чтобы позволить обеим условным ветвям оказывать влияние на выражениеприсваивания, и чтобы устранить сбивающий с толку и довольно бесполезный случайиспользования запятой в качестве центрального выражения.

11.13 Операторы присваивания

Синтаксис

ВыражениеПрисваивания :УсловноеВыражение ЛевостороннееВыражение ОператорПрисваивания ВыражениеПрисваивания

ВыражениеПрисваиванияБезIn :УсловноеВыражениеБезIn ЛевостороннееВыражение ОператорПрисваивания ВыражениеПрисваиванияБезIn

ОператорПрисваивания : один из= *= /= %= += -= <<= >>= >>>= &= ^= |=

Семантика

Значения нетерминалов ВыражениеПрисваиванияБезIn вычисляются по той же схеме, чтои для нетерминалов ВыражениеПрисваивания за исключением того, что значениявложенных УсловногоВыраженияБезIn и ВыраженияПрисваиванияБезIn вычисляютсясоответственно вместо вложенных УсловногоВыражения и ВыраженияПрисваивания.

11.13.1 Простое присваивание ( = )

Значение нетерминала ВыражениеПрисваивания : ЛевостороннееВыражение =ВыражениеПрисваивания вычисляется по следующей схеме:

Page 92: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Вычислить значение ЛевостороннегоВыражения.

2. Вычислить значение ВыраженияПрисваивания.

3. Вызвать ПолучитьЗначение(Результат(2)).

4. Вызвать ЗаписатьЗначение(Результат(1), Результат(3)).

5. Вернуть Результат(3).

11.13.2 Составное присваивание ( оп= )

Значение нетерминала ВыражениеПрисваивания : ЛевостороннееВыражение @ =ВыражениеПрисваивания, где @ обозначает один из приведённых выше операторов,вычисляется по следующей схеме:

1. Вычислить значение ЛевостороннегоВыражения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияПрисваивания.

4. Вызвать ПолучитьЗначение(Результата(3)).

5. Применить оператор @ к Результату(2) и Результату(4).

6. Вызвать ЗаписатьЗначение(Результат(1), Результат(5)).

7. Вернуть Результат(5).

11.14 Оператор-запятая ( , )

Синтаксис

Выражение :ВыражениеПрисваивания Выражение , ВыражениеПрисваивания

ВыражениеБезIn :ВыражениеПрисваиванияБезIn ВыражениеБезIn , ВыражениеПрисваиванияБезIn

Семантика

Значение нетерминала Выражение : Выражение , ВыражениеПрисваивания вычисляется последующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вычислить значение ВыраженияПрисваивания.

4. Вызвать ПолучитьЗначение(Результата(3)).

Page 93: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

5. Вернуть Результат(4).

Значение нетерминала ВыражениеБезIn вычисляется по той же схеме, что и длянетерминала Выражение за исключением того, что значения вложенных ВыраженияБезInи ВыраженияПрисваиванияБезIn вычисляются соответственно вместо вложенныхВыражения и ВыраженияПрисваивания.

Синтаксис12 Инструкции

Синтаксис

Инструкция :Блок ИнструкцияПеременной ПустаяИнструкция ИнструкцияВыражение ИнструкцияIfИнструкцияИтерации ИнструкцияContinue ИнструкцияBreak ИнструкцияReturn ИнструкцияWith ИнструкцияСМеткой ИнструкцияSwitch ИнструкцияThrow ИнструкцияTry

Семантика

Инструкция может быть частью ИнструкцииСМеткой, которая тоже может являться частьюИнструкцииСМеткой, и так далее. Определённые таким образом метки совместноназываются в описаниях семантики отдельных инструкций "текущим набором меток".ИнструкцияСМеткой не имеет никакого семантического предназначения кромедобавления новой метки к набору меток. Набор меток ИнструкцииИтерации илиИнструкцииSwitch изначально содержит единственный элемент пусто. Набор метоклюбой другой инструкции изначально пуст.

12.1 Блок

Синтаксис

Блок :{ СписокИнструкцийопц }

СписокИнструкций :Инструкция СписокИнструкций Инструкция

Семантика

Page 94: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала Блок : {} вычисляется по следующей схеме:

1. Вернуть (normal, empty, empty).

Значение нетерминала Блок : { СписокИнструкций } вычисляется по следующей схеме:

1. Вычислить значение СпискаИнструкций.

2. Вернуть Результат(1).

Значение нетерминала СписокИнструкций : Инструкция вычисляется по следующейсхеме:

1. Вычислить значение Инструкции.

2. Если было брошено исключение, вернуть (throw, V, empty), где V - исключение. (Далеевыполнение продолжается, как будто исключения брошено не было.)

3. Вернуть Результат(1).

Значение нетерминала СписокИнструкций : СписокИнструкций Инструкция вычисляетсяпо следующей схеме:

1. Вычислить значение СпискаИнструкций.

2. Если Результат(1) является неожиданным завершением, вернуть Результат(1).

3. Вычислить значение Инструкции.

4. Если было брошено исключение, вернуть (throw, V, empty), где V - исключение. (Далеевыполнение продолжается, как будто исключения брошено не было.)

5. Если Результат(3). значение равно empty, приравнять V = Результат(1). значение, иначеприравнять V = Результат(3). значение.

6. Вернуть (Результат(3). тип, V, Результат(3). цель).

12.2 Выражение переменной

Синтаксис

ИнструкцияПеременной :var СписокОбъявленияПеременных ;

СписокОбъявленияПеременных :ОбъявлениеПеременной СписокОбъявленияПеременных , ОбъявлениеПеременной

СписокОбъявленияПеременныхБезIn :ОбъявлениеПеременнойБезIn СписокОбъявленияПеременныхБезIn , ОбъявлениеПеременнойБезIn

ОбъявлениеПеременной :

Page 95: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Идентификатор Инициализаторопц

ОбъявлениеПеременнойБезIn :Идентификатор ИнициализаторБезInопц

Инициализатор := ВыражениеПрисваивания

ИнициализаторБезIn := ВыражениеПрисваиванияБезIn

Описание

Если инструкция переменной встречается внутри ОбъявленияФункции, переменныеобъявляются внутри локальной области видимости для данной функции согласноописанию в разделе 10.1.3. В противном случае они объявляются в глобальной областивидимости (т.е. создаются как поля глобального объекта согласно описанию в разделе10.1.3) с использованием атрибутов свойств { DontDelete }. Переменные создаются, когдапроисходит вход в область выполнения. Блок не определяет новой области выполнения.Только Программа и ОбъявлениеФункции создают новую область видимости.Переменные инициализируются при создании значением undefined. Переменной, длякоторой определён Инициализатор, присваивается значение егоВыраженияПрисваивания в момент выполнения ИнструкцииПеременной, а не в моментсоздания переменной.

Семантика

Значение нетерминала ИнструкцияПеременной : var СписокОбъявленияПеременных ;вычисляется по следующей схеме:

1. Вычислить значение СпискаОбъявленияПеременных.

2. Вернуть (normal, empty, empty).

Значение нетерминала СписокОбъявленияПеременных :ОбъявлениеПеременнойвычисляется по следующей схеме:

1. Вычислить значение ОбъявленияПеременной.

Значение нетерминала СписокОбъявленияПеременных : СписокОбъявленияПеременных ,ОбъявлениеПеременной вычисляется по следующей схеме:

1. Вычислить значение СпискаОбъявленияПеременных.

2. Вычислить значение ОбъявленияПеременной.

Значение нетерминала ОбъявлениеПеременной : Идентификатор вычисляется последующей схеме:

1. Вернуть строковое значение, содержащее ту же последовательность символов, что иИдентификатор.

Значение нетерминала ОбъявлениеПеременной : Идентификатор Инициализатор

Page 96: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

вычисляется по следующей схеме:

1. Вычислить значение Идентификатора согласно описанию в разделе 11.1.2.

2. Вычислить значение Инициализатора.

3. Вызвать ПолучитьЗначение(Результат(2)).

4. Вызвать ЗаписатьЗначение(Результат(1), Результат(3)).

5. Вернуть строковое значение, содержащее ту же последовательность символов, что иИдентификатор.

Значение нетерминала Инициализатор : = ВыражениеПрисваивания вычисляется последующей схеме:

1. Вычислить значение ВыраженияПрисваивания.

2. Вернуть Результат(1).

Значения нетерминалов СписокОбъявленияПеременныхБезIn,ОбъявлениеПеременнойБезIn и ИнициализаторБезIn вычисляются по той же схеме, что иСписокОбъявленияПеременных, ОбъявлениеПеременной и Инициализатор заисключением того, что значение вложенных СпискаОбъявленияПеременныхБезIn,ОбъявленияПеременнойБезIn, ИнициализатораБезIn и ВыраженияПрисваиванияБезInвычисляются соответственно вместо вложенных СпискаОбъявленияПеременных,ОбъявленияПеременной, Инициализатора и ВыраженияПрисваивания.

12.3 Пустая инструкция

Синтаксис

ПустаяИнструкция :;

Семантика

Значение нетерминала ПустаяИнструкция : ; вычисляется по следующей схеме:

1. Вернуть (normal, empty, empty).

12.4 Инструкция-выражение

Синтаксис

ИнструкцияВыражение :[предпросмотр {{, function}] Выражение ;

Заметим, что ИнструкцияВыражение не может начаться с открывающей фигурной скобки,т.к. тогда оно было бы неотличимо от Блока. Также ИнструкцияВыражение не можетначинаться с ключевого слова function, т.к. тогда оно было бы неотличимо отОбъявленияФункции.

Семантика

Page 97: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ИнструкцияВыражение : [предпросмотр {{, function}] Выражение;вычисляется по следующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вернуть (normal, Результат(2), empty).

12.5 Инструкция if

Синтаксис

ИнструкцияIf :if ( Выражение ) Инструкция else Инструкция if ( Выражение ) Инструкция

Каждое ключевое слово else, для которого выбор соответствующего ему ifнеоднозначен, должно считаться относящимся к ближайшему if, для которого нетсоответствующего ему else.

Семантика

Значение нетерминала ИнструкцияIf : if ( Выражение ) Инструкция else Инструкциявычисляется по следующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вызвать ToBoolean(Результат(2)).

4. Если Результат(3) равен false - переход на шаг 7.

5. Вычислить значение первой Инструкции.

6. Вернуть Результат(5).

Вычислить значение второй Инструкции.

8.Вернуть Результат(7).

Значение нетерминала ИнструкцияIf : if ( Выражение ) Инструкция вычисляется последующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вызвать ToBoolean(Результат(2)).

4. Если Результат(3) равен false - вернуть (normal, empty, empty).

5. Вычислить значение Инструкции.

Page 98: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Вернуть Результат(5).

12.6 Инструкции итерации

Инструкция итерации состоит из заголовка (который содержит ключевое слово изаключённую в скобки управляющую конструкцию) и тела (которое состоит изИнструкций).

Синтаксис

ИнструкцияИтерации :do Инструкция while ( Выражение ); while ( Выражение ) Инструкция for ( ВыражениеБезInопц; Выражениеопц ; Выражениеопц ) Инструкция for (var СписокОбъявленияПеременныхБезIn; Выражениеопц ; Выражениеопц )Инструкция for ( ЛевостороннееВыражение in Выражение ) Инструкция for (var ОбъявлениеПеременнойБезIn in Выражение ) Инструкция

12.6.1 Инструкция do-while

Значение нетерминала do Инструкция while ( Выражение ); вычисляется по следующейсхеме:

1. Пусть V = empty.

2. Вычислить значение Инструкции.

3. Если Результат(2). значение не равно empty, приравнять V = Результат(2). значение.

4. Если Результат(2). тип равен continue и Результат(2). цель принадлежит текущемунабору меток - переход на шаг 7.

5. Если Результат(2). тип равен break и Результат(2). цель принадлежит текущему наборуметок - вернуть (normal, V, empty).

6. Если Результат(2) является неожиданным завершением, вернуть Результат(2).

7. Вычислить значение Выражения.

8. Вызвать ПолучитьЗначение(Результат(7)).

9. Вызвать ToBoolean(Результат(8)).

10. Если Результат(9) равен true - переход на шаг 2.

11. Вернуть (normal, V, empty);

12.6.2 Инструкция while

Значение нетерминала ИнструкцияИтерации : while ( Выражение ) Инструкциявычисляется по следующей схеме:

Page 99: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Пусть V = empty.

2. Вычислить значение Выражения.

3. Вызвать ПолучитьЗначение(Результат(2)).

4. Вызвать ToBoolean(Результат(3)).

4. Если Результат(4) равен false - вернуть (normal, V, empty).

6. Вычислить значение Инструкции.

7. Если Результат(6). значение не равно empty, приравнять V = Результат(6). значение.

8. Если Результат(6). тип равен continue и Результат(6). цель принадлежит текущемунабору меток - переход на шаг 2.

9. Если Результат(6). тип равен break и Результат(6). цель принадлежит текущему наборуметок - вернуть (normal, V, empty).

10. 2. Если Результат(6) является неожиданным завершением, вернуть Результат(6).

11. Переход на шаг 2.

12.6.3 Инструкция for

Значение нетерминала ИнструкцияИтерации : for ( ВыражениеБезInопц ; Выражениеопц ;Выражениеопц) Инструкция вычисляется по следующей схеме:

1. Если ВыражениеБезIn опущено - переход на шаг 4.

2. Вычислить значение ВыраженияБезIn.

3. Вызвать ПолучитьЗначение(Результат(2)). (В дальнейшем это значение не используется.)

4. Пусть V = empty.

5. Если первое Выражение опущено - переход на шаг 10.

6. Вычислить значение первого Выражения.

7. Вызвать ПолучитьЗначение(Результат(6)).

8. Вызвать ToBoolean(Результат(7)).

9. Если Результат(8) равен false - переход на шаг 19.

10. Вычислить значение Инструкции.

11. Если Результат(10). значение не равно empty, приравнять V = Результат(10).значение.

12. Если Результат(10). тип равен break и Результат(10). цель принадлежит текущемунабору меток - переход на шаг 19.

Page 100: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

13. Если Результат(10). тип равен continue и Результат(10). цель принадлежит текущемунабору меток - переход на шаг 15.

14. Если Результат(10) является неожиданным завершением, вернуть Результат(10).

15. Если второе Выражение опущено - переход на шаг 5.

16. Вычислить значение второго Выражения.

17. Вызвать ПолучитьЗначение(Результат(16)). (В дальнейшем это значение неиспользуется.)

18. Переход на шаг 5.

19. Вернуть (normal, V, empty).

Значение нетерминала ИнструкцияИтерации : for (varСписокОбъявленияПеременныхБезIn ; Выражениеопц ; Выражениеопц ) Инструкциявычисляется по следующей схеме:

1. Вычислить значение СпискаОбъявленияПеременныхБезIn.

2. Пусть V = empty.

3. Если первое Выражение опущено - переход на шаг 8.

4. Вычислить значение первого Выражения.

5. Вызвать ПолучитьЗначение(Результат(4)).

6. Вызвать ToBoolean(Результат(5)).

7. Если Результат(6) равен false - переход на шаг 17.

8. Вычислить значение Инструкции.

9. Если Результат(8). значение не равно empty, приравнять V = Результат(8). значение.

10. Если Результат(8). тип равен break и Результат(8). цель принадлежит текущемунабору меток - переход на шаг 17.

11. Если Результат(8). тип равен continue и Результат(8). цель принадлежит текущемунабору меток - переход на шаг 13.

12. Если Результат(8) является неожиданным завершением, вернуть Результат(8).

13. Если второе Выражение опущено - переход на шаг 3.

14. Вычислить значение второго Выражения.

15. Вызвать ПолучитьЗначение(Результат(14)). (В дальнейшем это значение неиспользуется.)

16. Переход на шаг 3.

Page 101: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

17. Вернуть (normal, V, empty).

12.6.4 Инструкция for-in

Значение нетерминала ИнструкцияИтерации : for ( ЛевостороннееВыражение inВыражение ) Инструкция вычисляется по следующей схеме:

1. Вычислить значение первого Выражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToObject(Результат(2)).

4. Пусть V = empty.

5. Получить имя следующего по очереди свойства Результата(3), которое не имеетсвойства DontEnum. Если такого свойства нет - переход на шаг 14.

6. Вычислить значение ЛевостороннегоВыражения (оно может вычисляться на каждойитерации).

7. Вызвать ЗаписатьЗначение(Результат(6), Результат(5)).

8. Вычислить значение Инструкции.

9. Если Результат(8). значение не равно empty, приравнять V = Результат(8). значение.

10. Если Результат(8). тип равен break и Результат(8). цель принадлежит текущемунабору меток - переход на шаг 14.

11. Если Результат(8). тип равен continue и Результат(8). цель принадлежит текущемунабору меток - переход на шаг 5.

12. Если Результат(8) является неожиданным завершением, вернуть Результат(8).

13. Переход на шаг 5.

14. Вернуть (normal, V, empty).

Значение нетерминала ИнструкцияИтерации : for (var ОбъявлениеПеременнойБезIn inВыражение ) Инструкция вычисляется по следующей схеме:

1. Вычислить значение ОбъявлениеПеременнойБезIn.

2. Вычислить значение Выражения.

3. Вызвать ПолучитьЗначение(Результат(2)).

4. Вызвать ToObject(Результат(3)).

5. Пусть V = empty.

6. Получить имя следующего по очереди свойства Результата(4), которое не имеетсвойства DontEnum. Если такого свойства нет - переход на шаг 15.

Page 102: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7. Вычислить значение Результата(1) как будто это Идентификатор, см. раздел 0 (да, ономожет вычисляться на каждой итерации).

8. Вызвать ЗаписатьЗначение(Результат(7), Результат(6)).

9. Вычислить значение Инструкции.

10. Если Результат(9). значение не равно empty, приравнять V = Результат(9). значение.

11. Если Результат(9). тип равен break и Результат(9). цель принадлежит текущемунабору меток - переход на шаг 15.

12. Если Результат(9). тип равен continue и Результат(9). цель принадлежит текущемунабору меток - переход на шаг 6.

13. Если Результат(8) является неожиданным завершением, вернуть Результат(8).

14. Переход на шаг 6.

15. Вернуть (normal, V, empty).

Механизм обхода (перечисления) свойств (шаг 5 первого алгоритма, шаг 6 второго)зависит от конкретной реализации. Порядок обхода определяется объектом. Свойстваобходимого объекта могут быть удалены во время обхода. Если свойство, которое ещёне было посещено, удаляется, то оно не будет посещено в оставшейся части обхода.Если новые свойства были добавлены к объекту во время перечисления, их посещение воставшейся части обхода не гарантируется.

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

12.7 Инструкция continue

Синтаксис

ИнструкцияContinue :continue [здесь нет КонцаСтроки] Идентификаторопц ;

Семантика

Программа считается синтаксически некорректной, если выполнено одно из следующихусловий:

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

Значение ИнструкцииContinue без Идентификатора вычисляется по следующей схеме:

Page 103: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Вернуть (continue, empty, empty).

Значение ИнструкцииContinue с опциональным Идентификатором вычисляется последующей схеме:

1. Вернуть (continue, empty, Идентификатор).

12.8 Инструкция break

Синтаксис

ИнструкцияBreak :break [здесь нет КонцаСтроки] Идентификаторопц ;

Семантика

Программа считается синтаксически некорректной, если выполнено одно из следующихусловий:

Программа содержит инструкцию break без опционального Идентификатора,которая не является прямо или непрямо (но без пересечения границ функций)вложенной в ИнструкциюИтерации или ИнструкциюSwitch.Программа содержит инструкцию continue с опциональным Идентификатором, нотакого Идентификатора нет в наборе меток Инструкции, окружающей (безпересечения границ функций) инструкцию break.

Значение ИнструкцииBreak без Идентификатора вычисляется следующим образом:

1. Вернуть (break, empty, empty).

Значение ИнструкцииBreak с Идентификатором вычисляется следующим образом:

1. Вернуть (break, empty, Идентификатор).

12.9 Инструкция return

Синтаксис

ИнструкцияReturn :return [здесь нет КонцаСтроки] Выражениеопц ;

Семантика

Программа считается синтаксически некорректной, если она содержит инструкцию returnвне ТелаФункции. Инструкция return заставляет функцию прекратить своё выполнение ивернуть значение вызывающему. Если Выражение опущено, возвращается значениеundefined. В прочих случаях возвращается значение Выражения.

Значение нетерминала ИнструкцияReturn : return [здесь нет КонцаСтроки] Выражениеопц; вычисляется по следующей схеме:

1. Если Выражение опущено - вернуть (return, undefined, empty).

Page 104: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Вычислить значение Выражения.

3. Вызвать ПолучитьЗначение(Результат(2)).

4. Вернуть (return, Результат(3), empty).

12.10 Инструкция with

Синтаксис

ИнструкцияWith :with ( Выражение ) Инструкция

Описание

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

Семантика

Значение нетерминала ИнструкцияWith : with ( Выражение ) Инструкция вычисляется последующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вызвать ToObject(Результат(2)).

4. Добавить Результат(3) к началу иерархии областей видимости.

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

6. Пусть C = Результат(5). Если на шаге 5 было брошено исключение, приравнять C =(throw, V, empty), где V - брошенное исключение. (Далее выполнение продолжается,как будто исключения брошено не было.)

7. Убрать Результат(3) из начала иерархии областей видимости.

8. Вернуть C.

ЗАМЕЧАНИЕКаким бы образом управление не покинуло вложенную 'Инструкцию': нормальным путём,неожиданным завершением или бросив исключение - иерархия областей видимостивсегда возвращается к первоначальному состоянию.

12.11 Инструкция switch

Синтаксис

ИнструкцияSwitch :switch ( Выражение ) БлокCase

Page 105: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

БлокCase :{ ВетвиCaseопц } { ВетвиCaseопц ВетвьПоУмолчанию ВетвиCaseопц }

ВетвиCase :ВетвьCase ВетвиCase ВетвьCase

ВетвьCase :case Выражение : СписокИнструкцийопц

ВетвьПоУмолчанию :default : СписокИнструкцийопц

Семантика

Значение нетерминала ИнструкцияSwitch : switch ( Выражение ) БлокCase вычисляется последующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вычислить значение БлокаCase, передав Результат(2) в качестве параметра.

4. Если Результат(3). тип равен break и Результат(2). цель принадлежит текущему наборуметок - вернуть (normal, Результат(3).значение, empty).

5. Вернуть Результат(3).

Значение нетерминала БлокCase : { ВетвиCaseопц } с учётом входного параметра inputвычисляется следующим образом:

1. Пусть V = empty.2. Пусть A равно списку ВетвейCase в порядке исходного текста.3. Пусть C равно следующей ВетвиCase в A. Если такой ВетвиCase не нашлось - переходна шаг 16.4. Вычислить значение C.5. Если input не равен Результату(4) (согласно определению оператора !==) - переход нашаг 3.6. Если у C нет СпискаИнструкций - переход на шаг 10.7. Вычислить значение СпискаИнструкций C и приравнять R результат.8. Если R - неожиданное завершение, вернуть R.9. Пусть V = R.значение.10. Пусть C - следующая ВетвиCase из A. Если такой ВетвиCase не нашлось - переход нашаг 16.11. Если у C нет СпискаИнструкций - переход на шаг 10.12. Вычислить значение СпискаИнструкций C, получив результат R.13. Если R.значение не равно empty, приравнять V = R.значение.14. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).15. Переход на шаг 10.

Page 106: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

16. Вернуть (normal, V, empty).

Значение нетерминала БлокCase : { ВетвиCaseопц ВетвьПоУмолчанию ВетвиCaseопц } сучётом входного параметра input вычисляется следующим образом:

1. Пусть V = empty.2. Пусть A - список ВетвейCase в первом элементе ВетвиCase в порядке исходноготекста.3. Пусть C - следующая ВетвьCase в A. Если такой ВетвиCase не нашлось - переход нашаг 11.4. Вычислить значение C.5. Если input не равен Результату(4) (согласно определению оператора !==) - переход нашаг 3.6. Если у C нет СпискаИнструкций - переход на шаг 20.7. Вычислить значение СпискаИнструкций C, получив результат R.8. Если R - неожиданное завершение, вернуть R.9. Пусть V = R.значение.10. Переход на шаг 20.11. Пусть B - список ВетвейCase во втором элементе ВетвиCase в порядке исходноготекста.12. Пусть C - следующая ВетвьCase в B. Если такой ВетвиCase не нашлось - переход нашаг 26.13. Вычислить значение C.14. Если input не равен Результату(13) (согласно определению оператора !==) - переходна шаг 12.15. Если у C нет СпискаИнструкций - переход на шаг 31.16. Вычислить значение СпискаИнструкций C, получив результат R.17. Если R - неожиданное завершение, вернуть R.18. Пусть V = R.значение.19. Переход на шаг 31.20. Пусть C - следующая ВетвьCase в A. Если такой ВетвиCase не нашлось - переход нашаг 26.21. Если у C нет СпискаИнструкций - переход на шаг 20.22. Вычислить значение СпискаИнструкций C, получив результат R.23. Если R.значение не равно пусто, приравнять V = R.значение.24. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).25. Переход на шаг 20.26. Если у ВетвиПоУмолчанию нет СпискаИнструкций - переход на шаг 30.27. Вычислить значение СпискаИнструкций ВетвиПоУмолчанию, получив результат R.28. Если R.значение не равно пусто, приравнять V = R.значение.29. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).30. Пусть B равно списку ВетвейCase во втором элементе ВетвиCase в порядке исходноготекста.31. Пусть C - следующая ВетвьCase в B. Если такой ВетвиCase не нашлось - переход нашаг 37.32. Если у C нет СпискаИнструкций - переход на шаг 31.33. Вычислить значение СпискаИнструкций C, получив результат R.34. Если R.значение не равно пусто, приравнять V = R.значение.35. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).36. Переход на шаг 31.37. Вернуть (normal, V, empty).

Page 107: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ВетвьCase : case Выражение : СписокИнструкцийопц вычисляетсяпо следующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вернуть Результат(2).

ЗАМЕЧАНИЕПри получении значения ВетвиCase соответствующий ей СписокИнструкций невыполняется. Просто вычисляется и возвращается значение Выражения, котороеиспользуется БлокомCase для выбора СпискаИнструкций, который следует начатьисполнять.

12.12 Инструкции с метками

Синтаксис

ИнструкцияСМеткой :Идентификатор : Инструкция

Семантика

Перед Инструкцией может быть указана метка. Инструкции с метками используютсятолько совместно с инструкциями break и continue, для которых были указаны меткиперехода. В ECMAScript нет оператора goto.

Программа на ECMAScript считается синтаксически некорректной, если она содержитИнструкциюСМеткой, которая находится внутри ИнструкцииСМеткой с таким жеИдентификатором в качестве метки. Исключение составляют метки, содержащиесявнутри ОбъявленийФункций, находящихся внутри инструкций с метками.

Значение нетерминала Идентификатор : Инструкция вычисляется путём добавленияИдентификатора к набору меток Инструкции и затем вычисления Инструкции. Если уИнструкцииСМеткой уже есть непустой набор меток, эти метки тоже добавляются кнабору меток Инструкции перед вычислением её значения. Если результат вычислениязначения Инструкции равен (break, V, L), где L равно Идентификатору, результатомвычисления нетерминала становится (normal, V, empty).

Перед вычислением значения ИнструкцииСМеткой, содержащаяся в ней Инструкциясчитается содержащей пустое множество меток, кроме тех случаев, когда этоИнструкцияИтерации или ИнструкцияSwitch. Тогда она считается имеющей множествометок, состоящее из одного элемента пусто.

12.13 Инструкция throw

Синтаксис

ИнструкцияThrow :throw [здесь нет КонцаСтроки] Выражение ;

Семантика

Page 108: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ИнструкцияThrow : throw [здесь нет КонцаСтроки] Выражение ;вычисляется по следующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результат(1)).

3. Вернуть (throw, Результат(2), empty).

12.14 Инструкций try

Синтаксис

ИнструкцияTry :try Блок Catch try Блок Finally try Блок Catch Finally

Catch :catch (Идентификатор ) Блок

Finally :finally Блок

Описание

Инструкция try используется для заключения в себе блока кода, в котором можетнаступить исключительное состояние, такое как ошибка выполнения или инструкцияthrow. Раздел catch содержит код обработки исключения. Когда раздел catch ловитисключение, его Идентификатор привязывается к этому исключению.

Семантика

Значение нетерминала ИнструкцияTry : try Блок Catch вычисляется по следующей схеме:

1. Вычислить значение Блока.

2. Если Результат(1). тип не равен throw - вернуть Результат(1).

3. Вычислить значение Catch с параметром Результат(1).

4. Вернуть Результат(3).

Значение нетерминала ИнструкцияTry : try Блок Finally вычисляется по следующей схеме:

1. Вычислить значение Блока.

2. Вычислить значение Finally.

3. Если Результат(2).тип равен normal, вернуть Результат(1).

4. Вернуть Результат(2).

Page 109: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ИнструкцияTry : try Блок Catch Finally вычисляется по следующейсхеме:

1. Вычислить значение Блока.

2. Пусть C = Результат(1).

3. Если Результат(1). тип не равен throw - переход на шаг 6.

4. Вычислить значение Catch с параметром Результат(1).

5. Пусть C = Результат(4).

6. Вычислить значение Finally.

7. Если Результат(6). тип равно normal - вернуть C.

8. Вернуть Результат(6).

Значение нетерминала Catch : catch (Идентификатор ) Блок вычисляется по следующейсхеме:

1. Пусть C равно параметру, переданному этому нетерминалу.

2. Создать новый объект, как он был бы создан выражением new Object().

3. Создать свойство в объекте Результат(2). Имя свойства Идентификатор, значениеравно C. значение, атрибуты равны { DontDelete }.

4. Добавить Результат(2) к началу иерархии областей видимости.

5. Вычислить значение Блока.

6. Убрать Результат(2) из начала иерархии областей видимости.

7. Вернуть Результат(5).

Значение нетерминала Finally : finally Блок вычисляется по следующей схеме:

1. Вычислить значение Блока.

2. Вернуть Результат(1).

Определение функции13 Определение функции

Синтаксис

ОбъявлениеФункции :function Идентификатор ( СписокФормальныхАргументовопц ){ ТелоФункции }

ВыражениеФункции :

Page 110: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

function Идентификаторопц ( СписокФормальныхАргументовопц ){ ТелоФункции }

СписокФормальныхАргументов :Идентификатор СписокФормальныхАргументов , Идентификатор

ТелоФункции :ЭлементыИсходногоКода

Семантика

Нетерминал ОбъявлениеФункции : function Идентификатор (СписокФормальныхАргументовопц ){ ТелоФункции } обрабатывается для полученияобъявления функции следующим образом:

1. Создать новый объект Function согласно разделу 13.2, используя аргументы изСпискаФормальныхАргументовопц и тело из ТелаФункции. Передать иерархию областейвидимости текущего контекста исполнения как ОбластьВидимости.

2. Создать свойство текущего объекта переменных (согласно определению в разделе10.1.3) с именем Идентификатор и значением Результат(1).

Значение нетерминала ВыражениеФункции : function ( СписокФормальныхАргументовопц){ ТелоФункции } вычисляется по следующей схеме:

1. Создать новый объект Function согласно разделу 13.2, используя аргументы изСпискаФормальныхАргументовопц и тело из ТелаФункции. Передать иерархию областейвидимости текущего контекста исполнения как ОбластьВидимости.

2. Вернуть Результат(1).

Значение нетерминала ВыражениеФункции : function Идентификатор (СписокФормальныхАргументовопц ){ ТелоФункции } вычисляется по следующей схеме

1. Создать новый объект, как он был бы создан выражением new Object().

2. Добавить Результат(1) к началу иерархии областей видимости.

3. Создать новый объект Function согласно разделу 13.2, используя аргументы изСпискаФормальныхАргументовопц и тело из ТелаФункции. Передать иерархию областейвидимости текущего контекста исполнения как ОбластьВидимости.

4. Создать свойство в объекте Результат(1). Имя свойства Идентификатор, значениеравно Результат(3), атрибуты - { DontDelete, ReadOnly }.

5. Убрать Результат(1) из начала иерархии областей видимости.

6. Вернуть Результат(3).

ЗАМЕЧАНИЕТелоФункции в ВыражениеФункции может ссылаться на Идентификатор, указанный вэтом же ВыраженииФункции, чтобы функция могла рекурсивно вызывать себя. Однако в

Page 111: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

отличие от ОбъявленияФункции Идентификатор ВыраженияФункции не влияет на областьвидимости, в которой находилось ВыражениеФункции, и не может использоваться дляссылки на функцию из этой области видимости.

Значение нетерминала ТелоФункции : ЭлементыИсходногоКода вычисляется последующей схеме:

1. Обработать объявления функций в ЭлементахИсходногоКода.

2. Вычислить значение ЭлементовИсходногоКода.

3. Вернуть Результат(2).

13.1 Определения

Для описания процесса создания объектов функций требуется пара определений:

13.1.1 Тождественные правила грамматики

Два применения грамматического правила для нетерминала ТелоФункции считаютсятождественными в одном из следующих случаев:

Для обоих случаев ТелоФункции было взято из одного и того же места исходногокода одной и той же программы на ECMAScript. Этот исходный код состоит изглобального кода и содержащихся в нём кодов функций согласно определениям вразделе 10.1.2.Для обоих случаев ТелоФункции было взято из одного и того же места исходногокода, переданного одному и тому же вызову eval (15.1.2.1). Этот исходный кодсостоит из eval-кода и содержащихся в нём кодов функций согласно определениямв разделе 10.1.2.

ЗАМЕЧАНИЕДва случая использования ТелаФункции, полученных путём вызова конструктора Function(см. разделы 15.3.1 и 15.3.2), никогда не считаются тождественными. Аналогично, дваслучая использования FunctionBody, полученных путём двух разных вызовов eval,никогда не считаются тождественными, даже если этим двум вызовам eval был переданодинаковый аргумент.

13.1.2 Объединённые объекты

Когда два или более объектов Function объединяются, у них появляются следующиеособенности:

Каждый раз, когда создаётся или устанавливается не-внутреннее свойство объектаO, соответствующее свойство немедленно создаётся или устанавливается в такое жезначение у всех объектов, объединённых с O.Каждый раз, когда удаляется не-внутреннее свойство объекта O, соответствующеесвойство немедленно удаляется у всех объектов, объединённых с O.Если объекты O и P объединены, для них операторы сравнения == и === даютположительный результат.Объединение транзитивно и симметрично, так что если объединить объекты O и P иобъединить объекты P и Q, то объекты O и Q тоже автоматически окажутсяобъединёнными.

Page 112: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ЗАМЕЧАНИЕДва или более объединённых объекта практически неразличимы, за исключением того,что они могут обладать различными внутренними свойствами. Данная спецификацияопределяет только одно внутреннее свойство, которое может различаться у такихобъектов - [[Scope]].

Объединённые объекты используются в данном стандарте как средство для точногоописания поведения языка. Не предполагается, что они будут использоваться в качествеобразца для практической реализации объектов типа Function. Вместо этогорекомендуется, чтобы реализация самостоятельно определяла случаи, в которыхразличия в свойствах [[Scope]] у двух или более объединённых объектов типа Functionнезаметны извне, и повторно использовала в таких случаях один и тот же объектFunction вместо создания набора объединённых объектов. Такая оптимизация являетсяразрешённой, поскольку данный стандарт описывает лишь внешнее поведение программна ECMAScript.

13.2 Создание объектов типа Function

Используя опциональный список аргументов, определённыйСпискомФормальныхАргументов, тело, определённое ТеломФункции, и иерархиюобластей видимости, определённую ОбластьюВидимости, объект типа Function создаётсяпо следующей схеме:

1. Если уже существует объект E, который был создан предыдущим вызовом алгоритмаданного раздела, и этому вызову было передано ТелоФункции, тождественноеТелуФункции, передаваемому сейчас, - переход на шаг 13. (Если существует болееодного объекта E, удовлетворяющего этим критериям - конкретная реализация языкаможет выбрать любой по своему усмотрению.)

2. Создать новый нативный объект ECMAScript, обозначив его как F.

3. Установить свойство [[Class]] объекта F в "Function".

4. Установить свойство [[Prototype]] объекта F стандартному прототипу объекта Functionсогласно описанию в разделе 15.3.3.1.

5. Установить свойство [[Call]] объекта F согласно описанию в разделе 13.2.1.

6. Установить свойство [[Construct]] объекта F согласно описанию в разделе 13.2.2.

7. Установить свойство [[Scope]] объекта F равным новой иерархии областей видимости(раздел 10.1.4), содержащей те же объекты, что и ОбластьВидимости.

8. Установить свойство length объекта F равным количеству формальных свойств,указанных в СпискеФормальныхАргументов. Если аргументов указано не было,установить свойство length объекта F равным 0. Этому свойству назначаются атрибутысогласно описанию в разделе 15.3.5.1.

9. Создать новый объект, как он был бы создан выражением new Object().

10. Установить свойство constructor объекта Результат(9) равным F. Этому свойствуназначаются атрибуты { DontEnum }.

Page 113: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

11. Установить свойство prototype объекта F равным Результату(9). Этому свойствуназначаются атрибуты согласно описанию в разделе 15.3.5.2.

12. Вернуть F.

13. Реализация по своему усмотрению может перейти либо на шаг 2, либо на шаг 14.

14. Создать новый нативный объект ECMAScript, объединённый с E, обозначив его как F.Скопировать все не-внутренние свойства и их атрибуты объекта E в объект F, чтобы не-внутренние свойства объектов E и F были идентичны.

15. Установить свойство [[Class]] объекта F в "Function".

16. Установить свойство [[Prototype]] объекта F стандартному прототипу объекта Functionсогласно описанию в разделе 15.3.3.1.

17. Установить свойство [[Call]] объекта F согласно описанию в разделе 13.2.1.

18. Установить свойство [[Construct]] объекта F согласно описанию в разделе 13.2.2.

19. Установить свойство [[Scope]] объекта F равным новой иерархии областей видимости(раздел 10.1.4), содержащей те же объекты, что и ОбластьВидимости.

20. Вернуть F.

ЗАМЕЧАНИЕСвойство prototype автоматически создаётся для каждой функции с целью обеспечениявозможности использования функции в качестве конструктора.

Шаг 1 позволяет реализации оптимизировать типичный случай функции A, имеющейвложенную независимую функцию B. В этом случае реализация может повторноиспользовать тот же объект для B, вместо того чтобы создавать каждый раз новыйэкземпляр при вызове A. Шаг 13 делает эту оптимизацию необязательной; реализация,которая предпочтёт не воспользоваться ей, перейдёт на шаг 2.

Например, для кода

function A() { function B(x) {return x* x;} return B;}

function C() { return eval("(function(x) {return x* x;})");}

var b1 = A();var b2 = A();function b3(x) {return x* x;}function b4(x) {return x* x;}var b5 = C();var b6 = C();

реализация может, но не обязана, объединить b1 и b2. Более того, она можетиспользовать для b1 и b2 один и тот же объект, поскольку нет возможности различить ихсвойства [[Scope]]. С другой стороны, реализация не должна объединять b3 и b4,поскольку их исходные коды не тождественны (согласно 13.1.1). Также реализация недолжна объединять b5 и b6, потому что они созданы двумя разными вызовами eval и,

Page 114: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

таким образом, их исходные коды не тождественны.

На практике скорее всего окажется целесообразным объединять объекты типа Functionтолько в тех случаях, когда реализация может доказать, что различия между ихсвойствами [[Scope]] не различимы, и в таких случаях можно повторно использовать одинобъект. Следуя этому принципу, реализация встретит только тривиальный случайобъединения объекта с самим собой.

13.2.1 [[Call]]

Когда вызывается свойство [[Call]] объекта F типа Function, предпринимаются следующиешаги:

1. Создать новый контекст исполнения, используя СписокФормальныхАргументовобъекта F, переданный список значений аргументов и значение this согласно описаниюв 10.2.3.

2. Вычислить значение ТелаФункции.

3. Выйти из контекста исполнения, созданного в шаге 1, восстановив предыдущийконтекст исполнения.

4. Если Результат(2). тип равен throw - бросить Результат(2). значение.

5. Если Результат(2). тип равен return - вернуть Результат(2). значение.

6. (Результат(2). тип в данной точке должен равняться normal.) Вернуть undefined.

13.2.2 [[Construct]]

Когда вызывается свойство [[Construct]] объекта F типа Function, предпринимаютсяследующие шаги:

1. Создать новый нативный объект ECMAScript.

2. Установить свойство [[Class]] объекта Результат(1) в "Object".

3. Получить значение свойства prototype объекта F.

4. Если Результат(3) является объектом, установить свойство [[Prototype]] Результата(1)равным Результату(3).

5. Если Результат(3) не является объектом, установить свойство [[Prototype]] Результата(1)равным стандартному прототипу объекта Object согласно описанию в разделе 15.2.3.1.

6. Вызвать свойство [[Call]] объекта F, указав Результат(1) в качестве значения this ипередав список аргументов, переданный вызову [[Construct]], в качестве значенийаргументов.

7. Если Тип(Результата(6)) не Object - вернуть Результат(6).

8. Вернуть Результат(1).

Page 115: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Программа14. Программа

Синтаксис

Программа :ЭлементыИсходногоКода

ЭлементыИсходногоКода :ЭлементИсходногоКода ЭлементыИсходногоКода ЭлементИсходногоКода

ЭлементИсходногоКода :Инструкция ОбъявлениеФункции

Семантика

Значение нетерминала Программа : ЭлементыИсходногоКода вычисляется по следующейсхеме:

1. Обработать объявления функций в ЭлементахИсходногоКода.

2. Вычислить значение ЭлементовИсходногоКода.

3. Вернуть Результат(2).

Нетерминал ЭлементыИсходногоКода : ЭлементИсходногоКода обрабатывается дляполучения объявлений функций следующим образом:

1. Обработать объявления функций в ЭлементеИсходногоКода.

Значение нетерминала ЭлементыИсходногоКода : ЭлементИсходногоКода вычисляетсяпо следующей схеме:

1. Вычислить значение ЭлементаИсходногоКода.

2. Вернуть Результат(1).

Нетерминал ЭлементыИсходногоКода : ЭлементыИсходногоКодаЭлементИсходногоКода обрабатывается для получения объявлений функций следующимобразом:

1. Обработать объявления функций в ЭлементахИсходногоКода.

2. Обработать объявления функций в ЭлементеИсходногоКода.

Значение нетерминала ЭлементыИсходногоКода : ЭлементыИсходногоКодаЭлементИсходногоКода вычисляется по следующей схеме:

1. Вычислить значение ЭлементовИсходногоКода.

Page 116: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Если Результат(1) является неожиданным завершением, вернуть Результат(1).

3. Вычислить значение ЭлементаИсходногоКода.

4. Вернуть Результат(3).

Нетерминал ЭлементИсходногоКода : Инструкция никак не обрабатывается дляполучения объявлений функций.

Значение нетерминала ЭлементИсходногоКода : Инструкция вычисляется по следующейсхеме:

1. Вычислить значение Инструкции.

2. Вернуть Результат(1).

Нетерминал ЭлементИсходногоКода : ОбъявлениеФункции обрабатывается для полученияобъявлений функций следующим образом:

1. Обработать ОбъявлениеФункции для получения объявлений функций (см. раздел 13).

Значение нетерминала ЭлементИсходногоКода : ОбъявлениеФункции вычисляется последующей схеме:

1. Вернуть (normal, empty, empty).

Нативные объекты ECMAScript15 Нативные объекты ECMAScript

Когда программа на ECMAScript начинает выполняться, ей доступны определённыевстроенные объекты. Один их них, глобальный объект, находится в иерархии областейвидимости исполняемой программы. Другие доступны как предопределённые свойстваглобального объекта.

Если иное не указывается явно, свойство [[Class]] встроенного объекта равно либо"Function", если у этого встроенного объекта есть свойство [[Call]], либо "Object", если уэтого встроенного объекта нет свойства [[Call]].

Многие встроенные объекты являются функциями, т.е. они могут быть вызваны сопределёнными аргументами. Некоторые из них являются конструкторами, т.е.функциями, которые следует использовать с оператором new. Для каждой встроеннойфункции данная спецификация описывает требуемые данной функцией аргументы исвойства объекта Function. Для каждого встроенного конструктора данная спецификацияописывает свойства объекта-прототипа этого конструктора и свойства конкретныхэкземпляров объекта, возвращаемых выражением new, которое вызывает конструктор.

Если иное не указывается явно в описании конкретной функции, если функции иликонструктору, описанному в данном разделе, передано меньше параметров, чем указанов его описании, функция или конструктор будет вести себя, как будто ему (ей) былопередано достаточное количество дополнительных аргументов, каждый из которыхпредставляет собой значение undefined value.

Page 117: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Если иное не указывается явно в описании конкретной функции, если функции иликонструктору, описанному в данном разделе, передано больше параметров, чем указанов его описании, поведение функции или конструктора не определено. В частности,реализациям разрешается (но не предписывается в обязательном порядке) бросать вэтом случае исключение TypeError.

ЗАМЕЧАНИЕРеализациям, добавляющим дополнительные возможности к набору встроенныхфункций, рекомендуется делать это путём определения новых функций, а не путёмвведения новых параметров для старых функций.

В качестве значения внутреннего свойства [[Prototype]] каждая встроенная функция икаждый встроенный конструктор имеют объект "прототип Function", представляющийсобой первоначальное значение выражения Function.prototype (см. раздел 15.3.2.1).

В качестве значения внутреннего свойства [[Prototype]] каждый встроенный объект-прототип имеет объект-прототип Object, представляющий собой первоначальноезначение выражения Object.prototype (см. раздел 15.3.2.1).

Если иное не указывается явно в описании конкретной функции, ни одна из встроенныхфункций, описанных в данном разделе, не должна реализовывать внутренний метод[[Construct]] . Если иное не указывается явно в описании конкретной функции, ни одна извстроенных функций, описанных в данном разделе, не должна иметь свойство prototype.Каждый встроенный объект типа Function, описанный в данном разделе (будь токонструктор, обычная функция или и то, и другое), обладает встроенным свойствомlength с целочисленным значением. Если иное не указывается явно, это значениеравняется наибольшему числу именованных формальных аргументов (включаянеобязательные), указанному в заголовке подраздела, описывающего эту функцию.

ЗАМЕЧАНИЕК примеру, объект типа Function, являющийся первоначальным значением свойства sliceобъекта прототипа String, описывается в подразделе под заголовком"String.prototype.slice(start , end)", в котором указаны два именованных аргумента start иend. Таким образом значение свойства length этого объекта типа Function равно 2.

В каждом случае свойство length каждого встроенного объекта Function, описанного вэтом разделе, обладает атрибутами { ReadOnly, DontDelete, DontEnum } и никакимидругими. Любое другое свойство в этом разделе обладает атрибутом { DontEnum } иникакими другими, если иное не указывается явно.

15.1 Глобальный объект

У глобального объекта нет свойства [[Construct]]. Глобальный объект невозможноиспользовать в качестве конструктора с оператором new.

У глобального объекта нет свойства [[Call]]. Глобальный объект невозможно вызвать какфункцию.

Значения свойств [[Prototype]] и [[Class]] глобального объекта зависят от конкретнойреализации.

15.1.1 Свойства-значения глобального объекта

Page 118: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.1.1.1 NaN

Первоначальным значением свойства NaN является NaN (см. раздел 8.5). Свойствообладает атрибутами { DontEnum, DontDelete}.

15.1.1.2 Infinity

Первоначальным значением свойства Infinity является +∞ (см. раздел 8.5). Свойствообладает атрибутами { DontEnum, DontDelete}.

15.1.1.3 undefined

Первоначальным значением свойства undefined является undefined (см. раздел 8.1).Свойство обладает атрибутами { DontEnum, DontDelete}.

15.1.2 Свойства-функции глобального объекта15.1.2.1 eval(x)

Когда функция eval вызывается с единственным аргументом x, предпринимаютсяследующие шаги:

1. Если x не является строковым значением, вернуть x.

2. Разобрать строку x как нетерминал Программа. Если разбор не удаётся, броситьисключение SyntaxError (но см. также раздел 16).

3. Вычислить значение программы из шага 2.

4. Если Результат(3). тип равен normal и его значение завершения равно V - вернутьзначение V.

5. Если Результат(3). тип равен normal и его значение завершения равно empty - вернутьзначение undefined.

6. Результат(3). тип должен быть throw. Бросить исключение Результат(3). значение.

Если значение свойства eval используется не для прямого вызова (т.е. когда его имя явноиспользуется в качестве Идентификатора для ВыраженияЭлемента в ВыраженииCall), акаким-либо другим путём, или свойству eval присваивается какое-либо значение -может быть брошено исключение EvalError.

15.1.2.2 parseInt(string , radix)

Функция parseInt возвращает целочисленное значение, получаемое в результатеинтерпретации содержимого строкового аргумента string как числа согласно указанномуоснованию системы счисления radix. Начальные пробелы в строке игнорируются. Еслиradix равен undefined или 0, он предполагается равным 10, за исключением тех случаев,когда число начинается с пар символов 0x или 0X,. В этих случаях основание (radix)предполагается равным 16. Любое число в системе счисления с основанием 16 такжеможет опционально начинаться с пар сивволов 0x или 0X.

Когда вызывается функция parseInt, предпринимаются следующие шаги:

1. Вызвать ToString(string).

Page 119: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Пусть S равно подстроке Результата(1), состоящей из первого символа, неявляющегося СтрСимвПробела и всех символов, следующих за ним. (Иными словами,удалить начальные пробелы.)

3. Пусть sign равно 1.

4. Если S не пустая строка и первый символ S является знаком минус -, то присвоить signзначение -1.

5. Если S не пустая строка и первый символ S является знаком плюс + или минус -,тоудалить первый символ из S.

6. Пусть R = ToInt32(radix).

7. Если R =0 - переход на шаг 11.

8. Если R <2 или R > 36 - вернуть NaN.

9. Если R = 16 - переход на шаг 13.

10. Переход на шаг 14.

11. Пусть R = 10.

12. Если длина S не меньше 1, а первый символ S равен "0", то реализация может посвоему усмотрению приравнять R = 8 или оставить R без изменений.

13. Если длина S не меньше 2, а первые два символа S равны "0x" или "0X" - удалитьпервые два символа из S и приравнять R = 16.

14. Если S содержит любой символ, который не является цифрой в системе счисления соснованием R, то приравнять Z подстроке S, состоящей из всех символов до первоготакого символа, иначе сделать Z равным S.

15. Если Z пусто, вернуть NaN.

16. Вычислить математическое целочисленное значение, представленное строкой Z всистеме счисления с основанием R, используя буквы A-Z и a-z для цифр со значениями от10 до 35. (Однако если R равно 10, а Z содержит более 20 значащих цифр, реализацияязыка вправе (но не обязана) заменить каждую значащую цифру после 20-й на 0. А еслиR не равно 2, 4, 8, 10, 16 или 32, то Результат(16) может быть зависящим от реализацииприближением к математическому целочисленному значению, которое выражено в Z всистеме счисления с основанием R.)

17. Вычислить численное значение Результата(16).

18. Вернуть sign * Результат(17).

ЗАМЕЧАНИЕparseInt может обработать только начальную часть строки в качестве целочисленногозначения; она игнорирует все символы, которые не могут являться частью записи числа, ине выдаёт никакого оповещения о том, что эти символы были проигнорированы.

Page 120: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Когда radix равно 0 или undefined, а число, содержащееся в строке начинается с цифры0, за которой не следует x или X, то реализация может по собственному усмотрениютрактовать число либо как восьмеричное, либо как десятичное. Рекомендуется, чтобыреализации в данном случае трактовали число как десятичное.

15.1.2.3 parseFloat(string)

Функция parseFloat возвращает численное значение, получаемое в результатеинтерпретации содержимого строкового аргумента string как десятичного литерала.

Когда вызывается функция parseFloat, предпринимаются следующие шаги:

1. Вызвать ToString(string).

2. Вычислить подстроку Результата(1), состоящую из первого символа слева, неявляющегося СтрСимвПробела и всех символов справа от него. (Иными словами, удалитьначальные пробелы.)

3. Если ни Результат(2), ни любой из префиксов Результата(2) не удовлетворяетсинтаксису СтрДесятичногоЛитерала (см. раздел 0), вернуть NaN.

4. Вычислить как можно более длинный префикс Результата(2) (он может совпадать ссамим Результатом(2)), который удовлетворяет синтаксису СтрДесятичногоЛитерала.

5. Вернуть численное значение МЗ Результата(4).

ЗАМЕЧАНИЕ parseInt может обработать только начальную часть строки в качестве численногозначения; она игнорирует все символы, которые не могут являться частью записи числа, ине выдаёт никакого оповещения о том, что эти символы были проигнорированы.

15.1.2.4 isNaN(number)

Применяет к своему аргументу ToNumber и затем возвращает true, если результат равенNaN, и false в прочих случаях.

15.1.2.5 isFinite(number)

Применяет к своему аргументу ToNumber и затем возвращает false, если результат равенNaN, +∞ или -∞, и true в прочих случаях.

15.1.3 Свойства-функции для обработки URI

Единообразные идентификаторы ресурсов (URI) представляют из себя строки,идентифицирующие ресурсы (например, веб-страницы или файлы) и транспортныепротоколы доступа к ним (например, HTTP или FTP) в сети Интернет. Язык ECMAScriptсам по себе не обеспечивает никакой поддержки использования URI, за исключениемфункций, кодирующих и декодирующих URI согласно описанию в разделах 15.1.3.1,15.1.3.2, 15.1.3.3 и 15.1.3.4.

ЗАМЕЧАНИЕМногие реализации ECMAScript предоставляют дополнительные функции и методы дляманипуляций с веб-страницами. Описание таких функций не входит в задачи данного

Page 121: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

стандарта.

URI состоит из последовательности компонент, разделённых разделителями компонент.Общий формат:

Схема : Первая / Вторая ; Третья ? Четвёртая

где выделенные курсивом имена обозначают компоненты, а ":", "/", ";" и "?"зарезервированы в качестве символов-разделителей. Функции encodeURI и decodeURIпредназначены для работы с полными URI. Они предполагают, что всезарезервированные символы в URI имеют специальное значение и поэтому не подлежаткодированию. Функции encodeURI и decodeURI предназначены для работы с компонентамиURI. Они предполагают, что все зарезервированные символы представляют собой частитекста и подлежат кодированию, чтобы при вставке компоненты в полный URI этисимволы не трактовались бы как зарезервированные.

Следующая лексическая грамматика описывает формат кодированных URI. uri :::uriСимволыопц

символыUri :::символUri символыUriопц

символUri :::uriЗарезервированныйuriНеэкранированный uriЭкранированный

uriЗарезервированный ::: один из; / ? : @ & = + $ ,

uriНеэкранированный :::uriБукваДесятичнаяЦифра uriЗнак

uriЭкранированный :::% ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра

uriБуква ::: одна изa b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

uriЗнак ::: один из- _ . ! ~ * ' ( )

Когда символ, который необходимо включить в URI, не принадлежит квышеприведённым описаниям или не должен иметь специальное значение, котороеиногда придаётся зарезервированным символам, этот символ должен быть закодирован.Символ предварительно преобразуется в последовательность октетов (8-разрядныхдвоичных чисел) при помощи преобразования UTF-8, причём суррогатные парыпредварительно преобразуются из кодировки UCS-2 в UCS-4. (Заметим, что для кодов издиапазона [0,127] результатом будет единичный октет с тем же значением.)

Page 122: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Результирующая последовательность октетов затем преобразуется в строку, в которойкаждый октет представляется escape-последовательностью вида "% xx" ("экранируется").

Процесс кодирования и экранирования описывается скрытой функцией Encode,принимающей два строковых аргумента: string и unescapedSet. Эта функцияопределяется только для пояснительных целей.

1. Вычислить количество символов в string.

2. Пусть R равно пустой строке.

3. Пусть k равно 0.

4. Если k равняется Результату(1), вернуть R.

5. Пусть C - символ string, находящийся в позиции k.

6. Если C не принадлежит множеству unescapedSet - переход на шаг 9.

7. Пусть S - строка, содержащая только символ C.

8. Переход на шаг 24.

9. Если юникодный код C находится в диапазоне от 0xDC00 до 0xDFFF включительно,бросить исключение URIError.

10. Если юникодный код C находится в диапазоне от 0xDB00 до 0xDBFF включительно,приравнять V значению кода C и перейти на шаг 16.

11. Увеличить k на 1.

12. Если k равняется Результату(1), бросить исключение URIError.

13. Получить значение юникодного кода символа string, находящегося в позиции k.

14. Если Результат(13) не находится в диапазоне от 0xDC00 до 0xDFFF включительно,бросить исключение URIError.

15. Пусть V равно (((код C) - 0xD800) * 0x400 + (Результат(13) - 0xDC00) + 0x10000).

16. Пусть Octets равно массиву октетов, получаемому путём применения преобразованияUTF-8 к V, и пусть L равно длине этого массива.

17. Пусть j равно 0.

18. Получить значение элемента Octets на позиции j .

19. Пусть S равно строке, содержащей три символа "% XY", где XY - двешестнадцатеричные цифры в верхнем регистре, кодирующие значение Результата(18).

20. Пусть R - новое строковое значение, получаемое конкатенацией предыдущегозначения R и S.

21. Увеличить j на 1.

Page 123: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

22. Если j равно L - переход на шаг 25.

23. Переход на шаг 18.

24. Пусть R - новое строковое значение, получаемое конкатенацией предыдущегозначения R и S.

25. Увеличить k на 1.

26. Переход на шаг 4.

Процесс декодирования и разэкранирования описывается скрытой функцией Decode,принимающей два строковых аргумента: string и reservedSet. Эта функция определяетсятолько для пояснительных целей.

1. Вычислить количество символов в string.

2. Пусть R равно пустой строке.

3. Пусть k равно 0.

4. Если k равняется Результату(1), вернуть R.

5. Пусть C - символ string, находящийся в позиции k.

6. Если C не равен '% ', переход на шаг 40.

7. Пусть start равно k.

8. Если k + 2 равно или больше Результата(1), бросить исключение URIError.

9. Если символы string на позициях (k + 1) и (k + 2) не выражают собойшестнадцатеричных цифр, бросить исключение URIError.

10. Пусть B равно 8-битному значению, которое представляют две шестнадцатеричныецифры на позициях (k + 1) и (k + 2).

11. Увеличить k на 2.

12. Если наиболее старший бит B равен 0, приравнять C символу, код которого равен B иперейти на шаг 37.

13. Пусть n - наименьшее неотрицательное число такое, что (B << n) & 0x80 равно 0.

14. Если n равно 1 или n больше 4 - бросить исключение URIError.

15. Пусть Octets - массив 8-битных целых длиной n.

16. Записать B в Octets на позиции 0.

17. Если k +(3 *(n - 1)) больше или равно Результату(1), бросить исключение URIError.

18. Пусть j равно 1.

Page 124: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

19. Если j равно n - переход на шаг 29.

20. Увеличить k на 1.

21. Если символ на позиции k не равен '%' - бросить исключение URIError.

22. Если символы string на позициях (k + 1) и (k + 2) не выражают собойшестнадцатеричных цифр, бросить исключение URIError.

23. Пусть B равно 8-битному значению, которое представляют две шестнадцатеричныецифры на позициях (k + 1) и (k + 2).

24. Если два наиболее старших бита B не равны 10, бросить исключение URIError.

25. Увеличить k на 2.

26. Записать B в Octets на позицию j.

27. Увеличить j на 1.

28. Переход на шаг 19.

29. Пусть V равно значению, получаемому путём применения преобразования UTF-8 кOctets (т.е. путём преобразования массива октетов в 32-битное значение).

30. Если V меньше 0x10000 - переход на шаг 36.

31. Если V больше 0x10FFFF - бросить исключение URIError.

32. Пусть L равно (((V - 0x10000) & 0x3FF) + 0xDC00).

33. Пусть H равно ((((V - 0x10000) >> 10) & 0x3FF) + 0xD800).

34. Пусть S - строка, содержащая два символа с кодами H и L.

35. Переход на шаг 41.

36. Пусть C равно символу с кодовым значением V.

37. Если C не в reservedSet - переход на шаг 40.

38. Пусть S равно подстроке строки string, содержащей символы с позиции start попозицию k включительно.

39. Переход на шаг 41.

40. Пусть S - строка, содержащая единственный символ C.

41. Пусть R - новое строковое значение, получаемое конкатенацией предыдущегозначения R и S.

42. Увеличить k на 1.

43. Переход на шаг 4.

Page 125: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ЗАМЕЧАНИЕ 1 Синтаксис URI приведён в RFC2396.

ЗАМЕЧАНИЕ 2 Формальное описание и реализация UTF-8 даны в Стандарте Юникода, версия 2.0,приложение A.

В UTF-8 символы кодируются последовательностями от 1 до 6 октетов. Старший битединственного октета "последовательности" из одного элемента установлен в 0,оставшиеся 7 бит используются для кодирования значения символа. Впоследовательности из n октетов, где n > 1, n старших битов первого октета равны 1, а(n+1)-й бит равен 0. Оставшиеся биты этого октета содержат биты значенииякодируемого символа. У всех оставшихся октетов старший бит равен 1, а следующий заним бит равен 0. Оставшиеся 6 бит содержат биты кодируемого символа. Символы вECMAScript могут быть закодированы в UTF-8 одним из следующих способов:

Код Юникода Представление 1ый октет 2ой октет 3ий октет 4ый октет0x0000 - 0x007F 00000000 0zzzzzzz 0zzzzzzz0x0080 - 0x07FF 00000yyy yyzzzzzz 110yyyyy 10zzzzzz0x0800 - 0xD7FF xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz0xD800 - 0xDBFF за которым следует 0xDC00 - 0xDFFF

110110vv vvwwwwxx за которым следует 110111yy yyzzzzzz

11110uuu 10uuwwww 10xxyyyy 10zzzzzz

0xD800 -0xDBFF за которым не следует 0xDC00 - 0xDFFF

вызывает URIError

0xDC00 - 0xDFFF вызывает URIError0xE000 - 0xFFFF xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz

Где

uuuuu = vvvv +1

чтобы учесть добавление 0x10000 согласно разделу 3.7 "Суррогаты" Стандарта Юникодаверсии 2.0. Диапазон кодов 0xD800-0xDFFF используется для кодирования суррогатныхпар; вышеописанное преобразование комбинирует суррогатную пару UCS-2 впредставление UCS-4 и кодирует результирующее 21-битное значение в UTF-8.Декодирование восстанавливает суррогатную пару.

15.1.3.1 decodeURI(encodedURI)

Функция decodeURI вычисляет новую версию URI, в которой все escape-последовательности и последовательности кодов UTF-8, которые могли быть введеныпри помощи функции encodeURI, заменяются на символы, которые они представляют.Escape-последовательности, которые не могли быть введены при помощи encodeURI,замене не подвергаются.

Когда функция decodeURI вызывается с единственным аргументом encodedURI,предпринимаются следующие шаги:

1. Вызвать ToString(encodedURI).

2. Пусть reservedURISet равно строке, содержащей по одному экземпляру каждогосимвола, разрешённого в uriReserved, плюс "#".

Page 126: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Вызвать Decode(Результат(1), reservedURISet)

4. Вернуть Результат(3).

ЗАМЕЧАНИЕСимвол "#" не декодируется в escape-последовательностях несмотря на то, что он неявляется зарезервированным символом в синтаксисе URI.

15.1.3.2 decodeURIComponent(encodedURIComponent)

Функция decodeURIComponent вычисляет новую версию URI, в которой все escape-последовательности и последовательности кодов UTF-8, которые могли быть введеныпри помощи функции encodeURIComponent, заменяются на символы, которые онипредставляют.

Когда функция decodeURIComponentval вызывается с единственным аргументомencodedURIComponent, предпринимаются следующие шаги:

1. Вызвать ToString(encodedURIComponent).

2. Пусть reservedURIComponentSet равняется пустой строке.

3. Вызвать Decode(Результат(1), reservedURIComponentSet)

4. Вернуть Результат(3).

15.1.3.3 encodeURI(uri)

Функция encodeURI вычисляет новую версию URI, в которой каждое вхождениеопределённых символов заменяется на одну, две, три или четыре escape-последовательности, представляющие закодированное значение символа в кодировкеUTF-8

Когда функция encodeURI вызывается с единственным аргументомuri, предпринимаютсяследующие шаги:

1. Вызвать ToString(uri).

2. Пусть unescapedURISet равно строке, содержащей по одному экземпляру каждогосимвола, разрешённого в uriReserved и uriUnescaped, плюс символ "#".

3. Вызвать Encode(Result(1), unescapedURISet)

4. Вернуть Результат(3).

ЗАМЕЧАНИЕСимвол "#" не кодируется escape-последовательностью, хотя он и не являетсязарезервированным или неэкранируемым символом URI.

15.1.3.4 encodeURIComponent(uriComponent)

Функция encodeURIComponent вычисляет новую версию URI, в которой каждое вхождениеопределённых символов заменяется на одну, две или три escape-последовательности,представляющие закодированное значение символа в кодировке UTF-8

Page 127: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Когда функция encodeURIComponent вызывается с единственным аргументом uriComponent,предпринимаются следующие шаги:

1. Вызвать ToString(uriComponent).

2. Пусть reservedURISet равно строке, содержащей по одному экземпляру каждогосимвола, разрешённого в uriUnescaped.

3. Вызвать Encode(Результат(1), unescapedURIComponentSet)

4. Вернуть Результат(3).

15.1.4 Свойства-конструкторы глобального объекта15.1.4.1 Object(...)

См. разделы 15.2.1 и 15.2.2.

15.1.4.2 Function(...)

См. разделы 15.3.1 и 15.3.2.

15.1.4.3 Array(...)

См. разделы 15.4.1 и 15.4.2.

15.1.4.4 String(...)

См. разделы 15.5.1 и 15.5.2.

15.1.4.5 Boolean(...)

См. разделы 15.6.1 и 15.6.2.

15.1.4.6 Number(...)

См. разделы 15.7.1 и 15.7.2.

15.1.4.7 Date(...)

См. раздел 15.9.2.

15.1.4.8 RegExp(...)

См. разделы 15.10.3 и 15.10.4.

15.1.4.9 Error(...)

См. разделы 15.11.1 и 15.11.2.

15.1.4.10 EvalError(...)

См. раздел 15.11.6.1.

15.1.4.11 RangeError(...)

Page 128: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. раздел 15.11.6.2.

15.1.4.12 ReferenceError(...)

См. раздел 15.11.6.3.

15.1.4.13 SyntaxError(...)

См. раздел 15.11.6.4.

15.1.4.14 TypeError(...)

См. раздел 15.11.6.5.

15.1.4.15 URIError(...)

См. раздел 15.11.6.6.

15.1.5 Другие свойства глобального объекта15.1.5.1 Math

См. раздел 15.8.

15.2 Объекты Object15.2.1 Вызов конструктора Object как функции

Когда Object вызывается не как конструктор, а как функция, он производитпреобразование типа.

15.2.1.1 Object([ value ] )

Когда функция Object вызывается без аргументов или с единственным аргументом value,предпринимаются следующие шаги:

1. Если value равно null, undefined или не указано, создать и вернуть новый объектObject точно так же, как если бы конструктор объекта был вызван с теми же самымиаргументами (см. раздел 15.2.2.1).

2. Вернуть ToObject(value).

15.2.2 Конструктор Object

Когда Object вызывается при помощи выражения new, он является конструктором и можетсоздать объект.

15.2.2.1 new Object([ value ] )

Когда конструктор Object вызывается без аргументов или с единственным аргументомvalue, предпринимаются следующие шаги:

1. Если value опущено - переход на шаг 8.

2. Если тип value не равен Object - переход на шаг 5.

Page 129: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Если value - нативный объект ECMAScript object, то не создавать нового объекта ипросто вернуть value.

4. Если value является объектом среды, предпринимаемые шаги и возвращаемый объектзависят от конкретной реализации и, возможно, от объекта среды.

5. Если тип value равен String, вернуть ToObject(value).

6. Если тип value равен Boolean, вернуть ToObject( value).

7. Если тип value равен Number, вернуть ToObject(value).

8. (Аргумент value не был передан или его тип был Null или Undefined.) Создать новый нативный объект ECMAScript. Свойство [[Prototype]] создаваемого объекта устанавливается в прототип Object. Свойство [[Class]] создаваемого объекта устанавливается в "Object". У создаваемогообъекта нет свойства [[Value]]. Вернуть созданный нативный объект.

15.2.3 Свойства конструктора Object

Значением внутреннего свойства [[Prototype]] конструктора Object является прототипFunction.

Кроме внутренних свойств и свойства length (значение которого равно 1), конструкторObject обладает следующими свойствами:

15.2.3.1 Object.prototype

Начальным значением Object.prototype является объект-прототип Object (см. раздел15.2.4).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.2.4 Свойства объекта-прототипа Object

Значение встроенного свойства [[Prototype]] объекта-прототипа Object равно null, азначение встроенного свойства [[Class]] равно "Object".

15.2.4.1 Object.prototype.constructor

Начальным значением Object.prototype.constructor является встроенный конструкторObject.

15.2.4.2 Object.prototype.toString()

Когда вызывается метод toString, предпринимаются следующие шаги:

1. Получить свойство [[Class]] данного объекта.

2. Получить строковое значение путём конкатенации трёх строк "[object ", Результат(1),и "]".

3. Вернуть Результат(2).

Page 130: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.2.4.3 Object.prototype.toLocaleString()

Эта функция возвращает результат вызова toString(). (Что означает, что результат вызоваэтой функции находится путём обращения к свойству toString для объекта this, котороене всегда содержит реализацию toString, описанную в разделе 15.2.4.2)

ЗАМЕЧАНИЕ 1 Данная функция введена, чтобы обеспечить для всех объектов общий интерфейсtoLocaleString ("к строке с учётом языковых настроек"), даже если не все им могутвоспользоваться. На данный момент Array, Number и Date обладают своими собственными,зависящими от языковых настроек реализациями метода toLocaleString.

ЗАМЕЧАНИЕ 2 Первый аргумент этой функции, скорее всего, будет задействован в следующей версииданного стандарта. Реализациям не рекомендуется использовать эту позицию спискааргументов для чего-либо ещё.

15.2.4.4 Object.prototype.valueOf()

Метод valueOf возвращает своё значение this. Если объект является результатом вызоваконструктора Object для объекта среды (см. раздел 15.2.2.1), то поведение valueOfзависит от реализации языка: он может вернуть либо значение this, либо какое-нибудьдругое значение, например объект среды, который первоначально был переданконструктору.

15.2.4.5 Object.prototype.hasOwnProperty(V)

Когда метод hasOwnProperty вызывается с аргументом V, предпринимаются следующиешаги:

1. Пусть O равно данному объекту.

2. Вызвать ToString(V).

3. Если у O нет свойства с именем, равным Результату(2), вернуть false.

4. Вернуть true.

ЗАМЕЧАНИЕВ отличие от [[HasProperty]] (см. раздел 8.6.2.4), этот метод не использует объекты изиерархии прототипов.

15.2.4.6 Object.prototype.isPrototypeOf(V)

Когда метод isPrototypeOf вызывается с аргументом V, предпринимаются следующиешаги:

1. Пусть O равно данному объекту.

2. Если V не является объектом - вернуть false.

3. Пусть V равно значению свойства [[Prototype]] объекта V.

Page 131: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

4. Если V равно null - вернуть false.

5. Если O и V ссылаются на один и тот же объект или на объединённые объекты (см.раздел 13.1.2) - вернуть true.

6. Переход на шаг 3.

15.2.4.7 Object.prototype.propertyIsEnumerable(V)

Когда метод propertyIsEnum вызывается с аргументом V, предпринимаются следующиешаги:

1. Пусть O равно данному объекту.

2. Вызвать ToString(V).

3. Если у O нет свойства с именем, равным Результату(2), вернуть false.

4. Если у свойства есть атрибут DontEnum - вернуть false.

5. Вернуть true.

ЗАМЕЧАНИЕЭтот метод не использует объекты из иерархии прототипов.

15.2.5 Свойства экземпляров Object

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

15.3 Объекты типа Function15.3.1 Вызов конструктора Function как функции

Когда Function вызывается не как конструктор, а как функция, он создаёт иинициализирует новый объект типа Function. Таким образом, вызов функцииFunction(...) эквивалентен выражению создания объекта new Function(...), вызванному стеми же аргументами.

15.3.1.1 Function(p1, p2, ... , pn, body)

Когда функция Function вызывается с некоторым набором аргументов p1, p2,..., pn, body(где n может равняться 0 - т.е. ни одного аргумента "p", и где body также может бытьопущено), предпринимаются следующие шаги:

1. Создать и вернуть новый объект Function, как если бы конструктор функции был бывызван с теми же аргументами (15.3.2.1).

15.3.2 Конструктор Function

Когда Function вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.3.2.1 new Function(p1, p2, ... , pn, body)

Page 132: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

В последнем аргументе указывается тело (выполняемый код) функции; всепредшествующие аргументы обозначают формальные параметры.

Когда конструктор Function вызывается с некоторым набором аргументов p1, p2,..., pn,body (где n может равняться 0 - т.е. ни одного аргумента "p", и где body также можетбыть опущено), предпринимаются следующие шаги:

1. Пусть P - пустая строка.

2. Если аргументов передано не было - приравнять body пустой строке и перейти на шаг13.

3. Если был передан один аргумент - приравнять body этому аргументу и перейти нашаг 13.

4. Пусть Результат(4) равняется первому аргументу.

5. Пусть P равно ToString(Результат(4)).

6. Пусть k равно 2.

7. Если k равно числу аргументов, приравнять body k-му аргументу и перейти на шаг 13.

8. Пусть Результат(8) равен k-му аргументу.

9. Вызвать ToString(Результат(8)).

10. Пусть P равно результату конкатенации предыдущего значения P, строки ","(запятой) и Результата(9).

11. Увеличить k на 1.

12. Переход на шаг 7.

13. Вызвать ToString(body).

14. Если P не может быть распознано как СписокФормальныхАргументовопц - броситьисключение SyntaxError.

15. Если body не может быть распознано как ТелоФункции - бросить исключениеSyntaxError.

16. Создать новый объект Function согласно описанию в разделе 13.2 с параметрами,получаемыми при распознавании P в качестве СпискаФормальныхАргументовопц, ителом, получаемым при распознавании body в качестве ТелаФункции. Передать внутрьиерархию областей видимости, состоящую из глобального объекта в качестве параметраОбластьВидимости.

17. Вернуть Результат(16).

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

Page 133: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ЗАМЕЧАНИЕРазрешается, но не обязательно, указывать каждый формальный аргумент функции вотдельном аргументе конструктора. Например, все три следующих выражения даютодинаковый результат:

new Function("a", "b", "c", "return a+b+c")

new Function("a, b, c", "return a+b+c")

new Function("a,b", "c", "return a+b+c")

15.3.3 Свойства конструктора Function

Значением внутреннего свойства [[Prototype]] конструктора Function является объект-прототип Function (см. раздел 15.3.4).

Помимо внутренних свойств и свойства length (значение которого равно 1), конструкторFunction обладает следующими свойствами:

15.3.3.1 Function.prototype

Начальным значением Function.prototype является объект-прототип Function (см. раздел15.3.4).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.3.4 Свойства объекта-прототипа Function

Объектом-прототипом Function является также объект Function (его [[Class]] равен"Function") который, будучи вызванным, принимает любые аргументы и возвращаетundefined.

Значением внутреннего свойства [[Prototype]] объекта-прототипа Function являетсяобъект-прототип Object (15.3.2.1).

Это функция с "пустым телом". Будучи вызванной, она просто возвращает undefined.

Объект-прототип Function не обладает своим собственным свойством valueOf, однако оннаследует свойство valueOf от объекта-прототипа Object.

15.3.4.1 Function.prototype.constructor

Начальным значением Function.prototype.constructor является встроенный конструкторFunction.

15.3.4.2 Function.prototype.toString()

Возвращается зависящее от конкретной реализации языка строковое представлениефункции. Это представление имеет синтаксис ОбъявленияФункции. Заметим, в частности,что использование и расположение пробелов, концов строк и точек с запятой встроковом представлении зависит от конкретной реализации.

Функция toString привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа Function. Таким образом, она не

Page 134: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

15.3.4.3 Function.prototype.apply(thisArg, argArray)

Метод apply принимает два аргумента, thisArg и argArray, и производит вызов функции сиспользованием свойства [[Call]] для данного объекта. Если у объекта нет свойства[[Call]], бросается исключение TypeError.

Если thisArg равно null или undefined, вызываемой функции в качестве значения thisпередаётся глобальный объект. В противном случае в качестве значения this вызываемойфункции передаётся ToObject(thisArg).

Если argArray равно null или undefined, вызываемой функции аргументов не передаётся.В противном случае, если argArray не является ни массивом, ни объектом аргументов (см.раздел 10.1.8), бросается исключение TypeError. Если argArray является массивом илиобъектом аргументов, функции передаётся (ToUint32(argArray. length)) аргументовargArray[ 0], argArray[ 1], ..., argArray[ ToUint32(argArray. length)- 1].

Свойство length метода apply имеет значение 2.

15.3.4.4 Function.prototype.call(thisArg [ , arg1 [ , arg2, ... ] ] )

Метод call принимает один или более аргументов, thisArg и (опционально) arg1, arg2 ит.д., и производит вызов функции с использованием свойства [[Call]] для данногообъекта. Если у объекта нет свойства [[Call]], бросается исключение TypeError. В качествеаргументов вызываемой функции передаются arg1, arg2 и т.д.

Если thisArg равно null или undefined, вызываемой функции в качестве значения thisпередаётся глобальный объект. В противном случае в качестве значения this вызываемойфункции передаётся ToObject(thisArg).

Свойство length метода call имеет значение 1.

15.3.5 Свойства экземпляров Function

В дополнение к обязательным внутренним свойствам, у каждого экземпляра функцииесть свойства [[Call]], [[Construct]] и [[Scope]] (см. разделы 8.6.2 и 13.2). Значениесвойства [[Class]] равно "Function".

15.3.5.1 length

Значение свойства length обычно равно целому числу, которое отражает "типичное"количество аргументов, ожидаемое функцией. Однако язык позволяет вызывать функциис другим числом аргументов. Поведение функции, вызванной с отличным от указанногов свойстве length количеством аргументов, зависит от конкретной функции. Это свойствообладает атрибутами { DontDelete, ReadOnly, DontEnum }.

15.3.5.2 prototype

Значение свойства prototype используется, чтобы инициализировать внутреннее свойство[[Prototype]] создаваемого объекта до того, как объект Function вызовется для него вкачестве конструктора. Свойство обладает атрибутом { DontDelete}.

Page 135: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.3.5.3 [[HasInstance]](V)

Предположим, что F является объектом типа Function.

Когда метод [[HasInstance]] объекта F вызывается со значением V, предпринимаютсяследующие шаги:

1. Если V не является объектом - вернуть false.

2. Вызвать метод [[Get]] объекта F с именем свойства "prototype".

3. Пусть O равно Результату(2).

4. Если O не является объектом - бросить исключение TypeError.

5. Пусть V равно значению свойства [[Prototype]] объекта V.

6. Если V равно null - вернуть false.

7. Если O и V ссылаются на один и тот же объект или на объединённые объекты (см.раздел 13.1.2) - вернуть true.

8. Переход на шаг 5.

15.4 Объекты Array

Объекты типа Array (массивы) специальным образом обрабатывают обращения копределённому классу имён свойств. Имя свойства P (в форме строкового значения)является индексом массива в том и только в том случае, когда ToString(ToUint32(P))равняется P и ToUint32(P) не равняется 232 - 1. Каждый объект типа Array обладаетсвойством length, значение которого всегда равно неотрицательному целому, меньшему,чем 232 . Значение свойства length численно больше чем имя каждого свойства,являющегося индексом массива. Когда свойства объекта типа Array создаются илименяются, другие свойства по необходимости корректируются для поддержания этогосоотношения. В частности, когда создаётся свойство, имя которого является индексоммассива, свойство length, если необходимо, изменяется, чтобы быть на единицу большечем этот индекс. А когда изменяется свойство length, все свойства, имена которыхявляются индексами массива, меньшими по величине, чем новое значение length,автоматически удаляются. Это ограничение применяется только к собственным свойствамобъекта Array и никак не зависит от свойств length или свойств-индексов массива,которые могут быть унаследованы им от прототипа.

15.4.1 Вызов конструктора Array как функции

Когда Array вызывается не как конструктор, а как функция, он создаёт и инициализируетновый объект типа Array. Таким образом, вызов функции Array(...) эквивалентенвыражению создания объекта new Array(...), вызванному с теми же аргументами.

15.4.1.1 Array([ item1[, item2 [,...]]])

Когда вызывается функция Array, предпринимаются следующие шаги:

1. Создать и вернуть новый объект Array, как если бы конструктор функции был бы

Page 136: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

вызван с теми же аргументами (15.4.2).

15.4.2 Конструктор Array

Когда Array вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.4.2.1 new Array([ item0[, item1 [,...]]])

Это описание справедливо тогда и только тогда, когда конструктору Array передаётсялибо ни одного, либо два или более аргумента.

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Array, т.е. тому, который представляет собой первоначальноезначение Array.prototype (см. раздел 15.4.3.1).

Свойство [[Class]] создаваемого объекта устанавливается в "Array".

Свойство length создаваемого объекта устанавливается равным числу аргументов.

Свойство 0 создаваемого объекта устанавливается равным аргументу item0 (если он былпередан), свойство 1 создаваемого объекта устанавливается равным аргументу item1(если он был передан) и аналогично для каждого аргумента: свойство k создаваемогообъекта устанавливается равным аргументу номер k, причём первый аргумент считаетсяаргументом номер 0.

15.4.2.2 new Array(len)

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Array, т.е. тому, который представляет собой первоначальноезначение Array.prototype (см. раздел 15.4.3.1). Свойство [[Class]] создаваемого объектаустанавливается в "Array".

Если аргумент len имеет тип Number и ToUint32(len) равно len, то свойство lengthсоздаваемого объекта устанавливается в ToUint32(len). Если аргумент len имеет типNumber и ToUint32(len) не равняется len - бросается исключение RangeError.

Если тип аргумента len отличен от Number, то свойство length создаваемого объектаустанавливается в 1, а свойство 0 создаваемого объекта устанавливается в len.

15.4.3 Свойства конструктора Array

Значением внутреннего свойства [[Prototype]] конструктора Array является объект-прототип Function (см. раздел 15.3.4).

Кроме внутренних свойств и свойства length (значение которого равно 1), конструкторArray обладает следующими свойствами:

15.4.3.1 Array.prototype

Начальным значением Array.prototype является объект-прототип Array (см. раздел 15.4.4).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

Page 137: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.4.4 Свойства объекта-прототипа Array

Значением внутреннего свойства [[Prototype]] объекта-прототипа Array является объект-прототип Object (15.2.3.1).

Объект-прототип Array сам по себе является массивом. Его [[Class]] равен "Array", у негоимеется свойство length (начальное значение которого равно +0) и специальныйвнутренний метод [[Put]], описанный в разделе 15.2.3.1.

В последующих описаниях функций, являющихся свойствами объекта-прототипа Array,словосочетание "данный объект" относится к значению this, переданному при вызовеэтой функции. Разрешается, чтобы this являлся объектом, для которого значениевнутреннего свойства [[Class]] не равно "Array".

ЗАМЕЧАНИЕОбъект-прототип Array не обладает своим собственным свойством valueOf, однако оннаследует свойство valueOf от объекта-прототипа Object.

15.4.4.1 Array.prototype.constructor

Начальным значением Array.prototype.constructor является встроенный конструктор Array.

15.4.4.2 Array.prototype.toString()

Результат вызова этой функции аналогичен результату вызова встроенного метода join спустым списком аргументов.

Функция toString привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа Array. Таким образом, она неможет быть передана другим типам объектов для использования в качестве метода.

15.4.4.3 Array.prototype.toLocaleString()

Элементы массива преобразовываются в строки с использованием своих методовtoLocaleString. Затем эти строки конкатенируются, разделённые копиями строки-разделителя, которая выбирается конкретной реализацией для конкретных языковыхнастроек. Подразумевается, что результат вызова этой функции должен бытьаналогичным результату вызова toString,, за исключением того, что результат этойфункции должен соответствовать языковым настройкам.

Результат вычисляется следующим образом:

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

2. Вызвать ToUint32(Результат(1)).

3. Пусть separator - строка, используемая для разделения элементов списка согласнотекущим языковым настройкам среды (способ определения этой строки зависит отконкретной реализации).

4. Вызвать ToString(separator).

5. Если Результат(2) равен нулю - вернуть пустую строку.

Page 138: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Вызвать метод [[Get]] данного объекта с аргументом "0".

7. Если Результат(6) равен undefined или null - использовать пустую строку. Впротивном случае вызвать ToObject(Result(6)). toLocaleString().

8. Пусть R равно Результат(7).

9. Пусть k равно 1.

10. Если k равняется Результату(2), вернуть R.

11. Пусть S равно строковому значению, получаемому конкатенацией R и Результата(4).

12. Вызвать метод [[Get]] данного объекта с аргументом ToString(k).

13. Если Результат(12) равен undefined или null - использовать пустую строку. Впротивном случае вызвать ToObject(Result(12)). toLocaleString().

14. Пусть R равно строковому значению, получаемому конкатенацией S и Результата(13).

15. Увеличить k на 1.

16. Переход на шаг 10.

Функция toLocaleString привязана к данному типу. Она бросает исключение TypeError,если переданное ей значение this не является объектом типа Array. Таким образом, онане может быть передана другим типам объектов для использования в качестве метода.

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

15.4.4.4 Array.prototype.concat([ item1[, item2 [,...]]])

Когда метод concat вызывается с нулём или более аргументами item1, item2 и т. д., онвозвращает массив, содержащий элементы объекта, за которыми следуют по очередиэлементы каждого аргумента.

Предпринимаются следующие шаги:

1. Пусть A - новый массив, как он был бы создан выражением new Array().

2. Пусть n равно 0.

3. Пусть E равно данному объекту.

4. Если E не является объектом типа Array - переход на шаг 16.

5. Пусть k равно 0.

6. Вызвать метод [[Get]] объекта E с аргументом "length".

7. Если k равняется Результату(6) - переход на шаг 19.

Page 139: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

8. Вызвать ToString(k).

9. Если у E есть свойство с названием, равным значению Результата(8), - переход на шаг10. Иначе - переход на шаг 13.

10. Вызвать ToString(n).

11. Вызвать метод [[Get]] объекта E с аргументом Результат(8).

12. Вызвать метод [[Put]] объекта A с аргументами Результат(10) и Результат(11).

13. Увеличить n на 1.

14. Увеличить k на 1.

15. Переход на шаг 7.

16. Вызвать ToString(n).

17. Вызвать метод [[Put]] объекта A с аргументами Результат(16) и E.

18. Увеличить n на 1.

19. Получить следующий по списку аргумент. Если больше аргументов не осталось -переход на шаг 22.

20. Пусть E равно Результату(19).

21. Переход на шаг 4.

22. Вызвать метод [[Put]] объекта A с аргументами "length" и n.

23. Вернуть A.

Значение свойства length для метода concat равно 1.

ЗАМЕЧАНИЕ Функция concat специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции concat к объектам среды зависит от реализации.

15.4.4.5 Array.prototype.join(separator)

Элементы массива преобразовываются в строки. Затем эти строки конкатенируются,разделённые при помощи копий значения separator. Если аргумент функции опущен, вкачестве разделителя используется одна запятая.

Метод join получает один аргумент, separator, и выполняет следующие шаги:

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

2. Вызвать ToUint32(Результат(1)).

Page 140: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Если separator равен undefined, присвоить separator значение строки из одногосимвола ",".

4. Вызвать ToString(separator).

5. Если Результат(2) равен нулю - вернуть пустую строку.

6. Вызвать метод [[Get]] данного объекта с аргументом "0".

7. Если Результат(6) равен undefined или null - использовать пустую строку. Впротивном случае вызвать ToString(Результат(6)).

8. Пусть R равно Результат(7).

9. Пусть k равно 1.

10. Если k равняется Результату(2), вернуть R.

11. Пусть S равно строковому значению, получаемому конкатенацией R и Результата(4).

12. Вызвать метод [[Get]] данного объекта с аргументом ToString(k).

13. Если Результат(12) равен undefined или null - использовать пустую строку. Впротивном случае вызвать ToString(Результат(12)).

14. Пусть R равно строковому значению, получаемому конкатенацией S и Результата(13).

15. Увеличить k на 1.

16. Переход на шаг 10.

Значение свойства length для метода join равно 1.

ЗАМЕЧАНИЕФункция join специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции join к объектам среды зависит от реализации.

15.4.4.6 Array.prototype.pop()

Последний элемент массива удаляется из массива и возвращается.

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

2. Вызвать ToUint32(Результат(1)).

3. Если Результат(2) не равен нулю - переход на шаг 6.

4. Вызвать метод [[Put]] данного объекта с аргументами "length" и Результат(2).

5. Вернуть undefined.

6. Вызвать ToString(Результат(2) - 1).

Page 141: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7. Вызвать метод [[Get]] данного объекта с аргументом Результат(6).

8. Вызвать метод [[Delete]] данного объекта с аргументом Результат(6).

9. Вызвать метод [[Put]] данного объекта с аргументами "length" и (Результат(2) - 1).

10. Вернуть Результат(7).

ЗАМЕЧАНИЕФункция pop специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции pop к объектам среды зависит от реализации.

15.4.4.7 Array.prototype.push([ item1[, item2 [,...]]])

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

Когда метод push вызывается с нулём или более аргументов item1, item2 и т.д.,предпринимаются следующие шаги:

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

2. Пусть n равно результату вызова ToUint32(Результат(1)).

3. Получить следующий по списку аргумент. Если больше аргументов не осталось -переход на шаг 7.

4. Вызвать метод [[Put]] данного объекта с аргументами ToString(n) и Результат(3).

5. Увеличить n на 1.

6. Переход на шаг 3.

7. Вызвать метод [[Put]] данного объекта с аргументами "length" и n.

8. Вернуть n.

Значение свойства length для метода push равно 1.

ЗАМЕЧАНИЕФункция push специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции join к объектам среды зависит от реализации.

15.4.4.8 Array.prototype.reverse()

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

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

Page 142: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Вызвать ToUint32(Результат(1)).

3. Вычислить floor(Результат(2)/ 2).

4. Пусть k равно 0.

5. Если k равно Результату(3), вернуть данный объект.

6. Вычислить Результат(2)-k-1.

7. Вызвать ToString(k).

8. Вызвать ToString(Результат(6)).

9. Вызвать метод [[Get]] данного объекта с аргументом Результат(7).

10. Вызвать метод [[Get]] данного объекта с аргументом Результат(8).

11. Если у данного объекта нет свойства с именем, равным значению Результата(8) -переход на шаг 19.

12. Если у данного объекта нет свойства с именем, равным значению Результата(7) -переход на шаг 16.

13. Вызвать метод [[Put]] данного объекта с аргументами Результат(7) и Результат(10).

14. Вызвать метод [[Put]] данного объекта с аргументами Результат(8) и Результат(9).

15. Переход на шаг 25.

16. Вызвать метод [[Put]] данного объекта с аргументами Результат(7) и Результат(10).

17. Вызвать метод [[Delete]] для данного объекта, передав Результат(8) в качестве именисвойства, подлежащего удалению.

18. Переход на шаг 25.

19. Если у данного объекта нет свойства с именем, равным значению Результата(7) -переход на шаг 23.

20. Вызвать метод [[Delete]] для данного объекта, передав Результат(7) в качестве именисвойства, подлежащего удалению.

21. Вызвать метод [[Put]] данного объекта с аргументами Результат(8) и Результат(9).

22. Переход на шаг 25.

23. Вызвать метод [[Delete]] для данного объекта, передав Результат(7) в качестве именисвойства, подлежащего удалению.

24. Вызвать метод [[Delete]] для данного объекта, передав Результат(8) в качестве именисвойства, подлежащего удалению.

25. Увеличить k на 1.

Page 143: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

26. Переход на шаг 5.

ЗАМЕЧАНИЕФункция reverse специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции reverse к объектам среды зависит от реализации.

15.4.4.9 Array.prototype.shift()

Первый элемент массива удаляется из массива и возвращается.

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

2. Вызвать ToUint32(Результат(1)).

3. Если Результат(2) не равен нулю - переход на шаг 6.

4. Вызвать метод [[Put]] данного объекта с аргументами "length" и Результат(2).

5. Вернуть undefined.

6. Вызвать метод [[Get]] данного объекта с аргументом "0".

7. Пусть k равно 1.

8. Если k равняется Результату(2) - переход на шаг 18.

9. Вызвать ToString(k).

10. Вызвать ToString(k-1).

11. Если у данного объекта есть свойство с именем, равным значению Result(9) -переход на шаг 12. В противном случае - переход на шаг 15.

12. Вызвать метод [[Get]] данного объекта с аргументом Результат(9).

13. Вызвать метод [[Put]] данного объекта с аргументами Результат(10) и Результат(12).

14. Переход на шаг 16.

15. Вызвать метод [[Delete]] данного объекта с аргументом Результат(10).

16. Увеличить k на 1.

17. Переход на шаг 8.

18. Вызвать метод [[Delete]] данного объекта с аргументом ToString(Результат(2)-1).

19. Вызвать метод [[Put]] данного объекта с аргументами "length" и (Результат(2) - 1).

20. Вернуть Результат(6).

ЗАМЕЧАНИЕФункция shift специально сделана не привязанной к типу. Она не требует, чтобы её

Page 144: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

значение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции shift к объектам среды зависит от реализации.

15.4.4.10 Array.prototype.slice(start, end)

Метод slice принимает два аргумента start и end и возвращает массив, содержащийэлементы исходного массива, начиная с элемента start до элемента end не включительно(или до конца массива, если end равно undefined). Если значение start отрицательно,вместо него используется значение (length+start), где length равно длине массива. Еслизначение end отрицательно, вместо него используется (length+ end), где length равнодлине массива. Предпринимаются следующие шаги:

1. Пусть A - новый массив, как он был бы создан выражением new Array().

2. Вызвать метод [[Get]] данного объекта с аргументом "length".

3. Вызвать ToUint32(Результата(2)).

4. Вызвать ToInteger(start).

5. Если значение Результата(4) отрицательно, использовать max((Результат(3)+Результат(4)), 0). Иначе использовать min(Результат(4), Результат(3)).

6. Пусть k равно Результату(5).

7. Если end равно undefined, использовать Результат(3). Иначе использоватьToInteger(end).

8. Если Результат(7) имеет отрицательное значение, использовать max((Result(3)+Result(7)), 0); иначе использовать min(Результат(7), Результат(3)).

9. Пусть n равно 0.

10. Если k больше или равно Результата(8) - переход на шаг 19.

11. Вызвать ToString(k).

12. Если у данного объекта есть свойство с именем, равным значению Result(11) -переход на шаг 13. В противном случае - переход на шаг 15.

13. Вызвать ToString(n).

14. Вызвать метод [[Get]] данного объекта с аргументом Результат(11).

15. Вызвать метод [[Put]] объекта A с аргументами Результат(13) и Результат(14).

16. Увеличить k на 1.

17. Увеличить n на 1.

18. Переход на шаг 10.

19. Вызвать метод [[Put]] объекта A с аргументами "length" и n.

Page 145: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

20. Вернуть A.

Значение свойства length для метода slice равно 2.

ЗАМЕЧАНИЕ Функция slice специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции slice к объектам среды зависит от реализации.

15.4.4.11 Array.prototype.sort(comparefn)

Элементы текущего массива сортируются. Сортировка необязательно устойчива (т.е.элементы, сравнивающиеся как равные, необязательно сохраняют первоначальныйпорядок). Если аргумент comparefn не равен undefined, он должен равняться функции,принимающей два аргумента x и y и возвращающей отрицательное значение при x < y,ноль при x = y и положительное значение при x > y.

Если comparefn не равен undefined и не представляет собой последовательной функциисравнения элементов массива (см. ниже), поведение sort определяется реализацией.Пусть len равно ToUint32(this.length). Если существуют целые i и j и объект P такие, чтовыполняются все приведённые ниже условия, то поведение sort зависит от реализации:

0 <= i < len0 <= j < lenthis не обладает свойством с именем ToString(i)P получается одним или несколькими последовательными обращениями к свойствам[[Prototype]], начиная с this.P обладает свойством с именем ToString(j)

Иначе предпринимаются следующие шаги.

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

2. Вызвать ToUint32(Результат(1)).

3. Выполнить зависящую от реализации последовательность вызовов методов [[Get]],[[Put]] и [[Delete]] данного объекта и метода SortCompare (описываемого ниже), гдепервым аргументом каждого из вызовов [[Get]], [[Put]] или [[Delete]] являетсянеотрицательное целое меньшее, чем Result(2), и где аргументами для вызоваSortCompare являются результаты предыдущего вызова метода [[Get]].

4. Вернуть данный объект.

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

Должна существовать некоторая математическая перестановка π , состоящая изнеотрицательных целых чисел, меньших, чем Результат(2), такая, что для каждогонеотрицательного целого j, меньшего, чем Результат(2), если свойство старый[j]существовало, то новый[π(j)] имеет в точности такое же значение, что и старый[j], ноесли свойство old[j] не существовало, то new[π(j)] тоже не существует.Тогда для всех неотрицательных целых чисел j и k, каждое из которых меньше

Page 146: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Результата(2), если SortCompare(j, k)< 0 (см. описание SortCompare ниже), то π(j)<π(k).

Здесь обозначение старый[j] используется для ссылки на гипотетический результатвызова метода [[Get]] для данного объекта с аргументом j до того, как функция былавыполнена, а обозначение new[j] - для ссылки на гипотетический результат вызоваметода [[Get]] для данного объекта с аргументом j после выполнения функции.

Функция comparefn является последовательной функцией сравнения для набора значенийS, если все из нижеприведённых требований выполняются для значений a, b и c(возможно, совпадающих) из множества S: обозначение a <CF b означает, чтоcomparefn(a, b)< 0, a =CF b означает, что comparefn(a, b) = 0 (любого знака), и a >CF bозначает, что comparefn(a, b)> 0.

Вызов comparefn(a, b) всегда возвращает одно и то же значение v, когда емупередаётся определённая пара значений a и b в качестве его двух аргументов.Более того, v имеет тип Number, а v не равно NaN. Заметим, что это подразумевает,что ровно одно из равенств a <CF b, a =CF b, и a >CF b будет справедливым длянекоторой пары a и b.a =CF a (рефлексивность)Если a =CF b, то b =CF a (симметрия)Если a =CF b и b =CF c, то a =CF c (транзитивность =CF)Если a <CF b и b <CF c, то a <CF c (транзитивность <CF)Если a >CF b и b >CF c, то a >CF c (транзитивность >CF)

ЗАМЕЧАНИЕВышеописанные условия необходимы и достаточны чтобы гарантировать, что comparefnразделяет множество S на классы эквивалентности и что эти классы эквивалентностиимеют полный порядок.

Когда оператор SortCompare вызывается с двумя аргументами j и k, предпринимаютсяследующие шаги:

1. Вызвать ToString(j).

2. Вызвать ToString(k).

3. Если у данного объекта нет ни свойства с именем, равным значению Результата(1), нисвойства с именем, равным значению Результата(2) - вернуть +0.

4. Если у данного объекта нет свойства с именем, равным значению Результата(1) -вернуть 1.

5. Если у данного объекта нет свойства с именем, равным значению Результата(2) -вернуть -1.

6. Вызвать метод [[Get]] данного объекта с аргументом Результат(1).

7. Вызвать метод [[Get]] данного объекта с аргументом Результат(2).

8. Пусть x равно Результату(6).

Page 147: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

9. Пусть y равно Результату(7).

10. Если x и y оба равны undefined - вернуть +0.

11. Если x равно undefined - вернуть 1.

12. Если y равно undefined - вернуть -1.

13. Если аргумент comparefn равен undefined - переход на шаг 16.

14. Вызвать comparefn с аргументами x и y.

15. Вернуть Результат(14).

16. Вызвать ToString(x).

17. Вызвать ToString(y).

18. Если Результат(16) < Результата(17) - вернуть -1.

19. Если Результат(16) > Результата(17) - вернуть 1.

20. Вернуть +0.

ЗАМЕЧАНИЕ 1 Поскольку несуществующие свойства всегда сравниваются как большие, чем undefined, аundefined всегда сравнивается как большее, чем какое-либо другое значение, свойствасо значениями undefined всегда смещаются сортировкой к концу результирующегомассива и за ними следуют несуществующие значения свойств.

ЗАМЕЧАНИЕ 2 Функция sort специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции sort к объектам среды зависит от реализации.

15.4.4.12 Array.prototype.splice(start, deleteCount [, item1 [, item2[,...]]])

Когда метод splice вызывается с двумя или более аргументами start, deleteCount и(опционально) item1, item2 и т.д., deleteCount элементов массива начиная с индекса startзаменяются аргументами item1, item2 и т.д Предпринимаются следующие шаги:

1. Пусть A - новый массив, как он был бы создан выражением new Array().

2. Вызвать метод [[Get]] данного объекта с аргументом "length".

3. Вызвать ToUint32(Результата(2)).

4. Вызвать ToInteger(start).

5. Если значение Результата(4) отрицательно, использовать max((Результат(3)+Результат(4)), 0). Иначе использовать min(Результат(4), Результат(3)).

6. Вычислить min(max(ToInteger(deleteCount), 0), Результат(3)-Результат(5)).

Page 148: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7. Пусть k равно 0.

8. Если k равняется Результату(6) - переход на шаг 16.

9. Вызвать ToString(Результат(5)+ k).

10. Если у данного объекта есть свойство с именем Результат (9) - переход на шаг 11. Впротивном случае - переход на шаг 14.

11. Вызвать ToString(k).

12. Вызвать метод [[Get]] данного объекта с аргументом Результат(9).

13. Вызвать метод [[Put]] объекта A с аргументами Результат(11) и Результат(12).

14. Увеличить k на 1.

15. Переход на шаг 8.

16. Вызвать метод [[Put]] объекта A с аргументами "length" и Результат(6).

17. Вычислить количество дополнительных аргументов item1, item2, и т.д.

18. Если Результат(17) равен Результату(6) - переход на шаг 48.

19. Если Результат(17) больше Результата(6) - переход на шаг 37.

20. Пусть k равно Результату(5).

21. Если k равняется (Результату(3)-Результат(6)) - переход на шаг 31.

22. Вызвать ToString(k+ Результат(6)).

23. Вызвать ToString(k+ Результат(17)).

24. Если у данного объекта есть свойство с именем Результат(22) - переход на шаг 25.Иначе переход на шаг 28.

25. Вызвать у данного объекта метод [[Get]] с аргументом Результат(22).

26. Вызвать метод [[Put]] данного объекта с аргументами Результат(23) и Результат(25).

27. Переход на шаг 29.

28. Вызвать метод [[Delete]] данного объекта с аргументом Результат(23).

29. Увеличить k на 1.

30. Переход на шаг 21.

31. Пусть k равно Результату(3).

32. Если k равняется (Результату(3)-Результат(6)+Результат(17)) - переход на шаг 48.

Page 149: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

33. Вызвать ToString(k-1).

34. Вызвать метод [[Delete]] данного объекта с аргументом Результат(33).

35. Уменьшить k на 1.

36. Переход на шаг 32.

37. Пусть k равно (Результат(3)-Результат(6)).

38. Если k равняется Результату(5) - переход на шаг 48.

39. Вызвать ToString(k+Результат(6)-1).

40. Вызвать ToString(k+Результат(17)-1).

41. Если у данного объекта есть свойство с именем, равным значению Result(39) -переход на шаг 42. В противном случае - переход на шаг 45.

42. Вызвать метод [[Get]] данного объекта с аргументом Результат(39).

43. Вызвать метод [[Put]] данного объекта с аргументами Результат(40) и Результат(42).

44. Переход на шаг 46.

45. Вызвать метод [[Delete]] данного объекта с аргументом Результат(40).

46. Уменьшить k на 1.

47. Переход на шаг 38.

48. Пусть k равно Результату(5).

49. Получить следующий аргумент из той части списка аргументов, которая начинается сitem1. Если таких аргументов больше не осталось - переход на шаг 53.

50. Вызвать метод [[Put]] данного объекта с аргументами ToString(k) и Результат(49).

51. Увеличить k на 1.

52. Переход на шаг 49.

53. Вызвать метод [[Put]] данного объекта с аргументами "length" и (Результат(3) -Результат(6) + Результат(17)).

54. Вернуть A.

Значение свойства length для метода splice равно 2.

ЗАМЕЧАНИЕФункция splice специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции splice к объектам среды зависит от реализации.

Page 150: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.4.4.13 Array.prototype.unshift([ item1[, item2 [,...]]])

Аргументы вставляются в начало массива таким образом, что их порядок в массивесовпадает с тем порядком, в котором они переданы функции.

Когда метод unshift вызывается с нулём или более аргументов item1, item2 и т.д.,предпринимаются следующие шаги:

1. Вызвать метод [[Get]] данного объекта с аргументом "length".

2. Вызвать ToUint32(Результат(1)).

3. Подсчитать количество аргументов.

4. Пусть k равно Результату(2).

5. Если k равно нулю - переход на шаг 15.

6. Вызвать ToString(k-1).

7. Вызвать ToString(k+Результат(3)-1).

8. Если у данного объекта есть свойство с именем, равным значению Result(6) - переходна шаг 9. В противном случае - переход на шаг 12.

9. Вызвать метод [[Get]] данного объекта с аргументом Результат(6).

10. Вызвать метод [[Put]] данного объекта с аргументами Результат(7) и Результат(9).

11. Переход на шаг 13.

12. Вызвать метод [[Delete]] данного объекта с аргументом Результат(7).

13. Уменьшить k на 1.

14. Переход на шаг 5.

15. Пусть k равно 0.

16. Получить следующий аргумент из той части списка аргументов, которая начинается сitem1. Если таких аргументов больше не осталось - переход на шаг 21.

17. Вызвать ToString(k).

18. Вызвать метод [[Put]] данного объекта с аргументами Результат(17) и Результат(16).

19. Увеличить k на 1.

20. Переход на шаг 16.

21. Вызвать метод [[Put]] данного объекта с аргументами "length" и(Результат(2)+Результат(3)).

22. Вернуть (Результат(2)+Результат(3)).

Page 151: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение свойства length для метода unshift равно 1.

ЗАМЕЧАНИЕФункция unshift специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа Array. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода. Возможность примененияфункции unshift к объектам среды зависит от реализации.

15.4.5 Свойства экземпляров Array

Экземпляры типа Array наследуют свойства объекта-прототипа Array, а также обладаютследующими свойствами:

15.4.5.1 [[Put]](P, V)

Объекты типа Array используют свой вариант метода [[Put]], отличающийся от метода,используемого для остальных нативных объектов ECMAScript (см. раздел 8.6.2.2).

Предположим, что A - объект типа Array, а P - строка. Когда метод [[Put]] объекта Aвызывается со свойством P и значением V, предпринимаются следующие шаги:

1. Вызвать метод [[CanPut]] у объекта A, передав имя P.

2. Если Результат(1) равен false - возврат.

3. Если у A нет свойства с именем P - переход на шаг 7.

4. Если P равно "length" - переход на шаг 12.

5. Установить значение свойства P объекта A равным V.

6. Переход на шаг 8.

7. Создать свойство с именем P, установить его значение в V и дать ему пустыеатрибуты.

8. Если P не является индексом массива - возврат.

9. Если ToUint32(P) меньше, чем значение свойства length объекта A - возврат.

10. Изменить (или установить) значение свойства length объекта A в ToUint32(P)+1.

11. Возврат.

12. Вычислить ToUint32(V).

13. Если Результат(12) не равен ToNumber(V) - бросить исключение RangeError.

14. Для каждого целого числа arg, меньшего значения свойства length объекта A, но неменьшего, чем Результат(12), если у A есть собственное (не унаследованное) свойство сименем ToString(k) - удалить это свойство.

15. Установить значение свойства P объекта A равным Результату(12).

Page 152: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

16. Возврат.

15.4.5.2 length

Свойство length данного объекта типа Array всегда численно больше, чем имя каждогосвойства, имя которого является индексом массива.

Свойство length обладает атрибутами { DontEnum, DontDelete }.

15.5 Объекты типа String15.5.1 Вызов конструктора String как функции

Когда String вызывается не как конструктор, а как функция, он производитпреобразование типа.

15.5.1.1 String([ value ] )

Возвращает строковое значение (не объект String), вычисляемое как ToString(value). Еслиvalue не передано, возвращается пустая строка "".

15.5.2 Конструктор String

Когда String вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.5.2.1 new String([ value ] )

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу String, т.е. тому, который представляет собой первоначальноезначение String.prototype (см. раздел 15.5.3.1).

Свойство [[Class]] создаваемого объекта устанавливается в "String".

Свойство [[Value]] создаваемого объекта устанавливается в ToString(value) или в пустуюстроку, если value не было передано.

15.5.3 Свойства конструктора String

Значением внутреннего свойства [[Prototype]] конструктора String является объект-прототип Function (см. раздел 15.3.4).

Кроме внутренних свойств и свойства length (значение которого равно 1), конструкторString обладает следующими свойствами:

15.5.3.1 String.prototype

Начальным значением String.prototype является объект-прототип String (см. раздел15.5.4).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.5.3.2 String.fromCharCode([ char0[, char1 [,...]]])

Вернуть строку, содержащую количество символов, равное количеству аргументов.

Page 153: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Каждый аргумент описывает по одному символу результирующей строки. Первыйаргумент описывает первый символ и так далее, слева направо.. Аргументпреобразовывается в символ путём применения операции ToUint16 (9.7) и использованиярезультирующего 16-битного целого в качестве кода символа. Если аргументов непередано, результатом является пустая строка.

Свойство length метода fromCharCode имеет значение 1.

15.5.4 Свойства объекта-прототипа String

Объектом-прототипом String является также объект String (его [[Class]] равен "String"),значением которого является пустая строка.

Значением внутреннего свойства [[Prototype]] объекта-прототипа String является объект-прототип Object (15.2.3.1).

15.5.4.1 String.prototype.constructor

Начальным значением String.prototype.constructor является встроенный конструкторString.

15.5.4.2 String.prototype.toString()

Возвращает строковое значение. (Заметим, что для объекта типа String метод toStringвозвращает тот же результат, что и метод valueOf.)

Функция toString привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа String. Таким образом, она неможет быть передана другим типам объектов для использования в качестве метода.

15.5.4.3 String.prototype.valueOf()

Возвращает строковое значение.

Функция valueOf привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа String. Таким образом, она неможет быть передана другим типам объектов для использования в качестве метода.

15.5.4.4 String.prototype.charAt(pos)

Возвращает строку, содержащую символ, находящийся на позиции pos в строке,получающейся в результате преобразования данного объекта к строке. Если на этойпозиции символа нет, результатом является пустая строка. Результатом являетсястроковое значение (не объект String).

Если pos является целочисленным значением типа Number, то результат x.charAt( pos)равняется результату x.substring( pos, pos+ 1).

Когда функция charAt вызывается с единственным аргументом pos, предпринимаютсяследующие шаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Вызвать ToInteger(pos).

Page 154: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Подсчитать количество символов в Результате(1).

4. Если Результат(2) меньше 0 или не меньше Результата(3) - вернуть пустую строку.

5. Вернуть строку длины 1, содержащую один символ Результата(1), а именно символ напозиции Результат(2). Первый (слева) символ Результата(1) считается находящимся напозиции 0, следующий - на позиции 1 и так далее.

ЗАМЕЧАНИЕФункция charAt специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.5 String.prototype.charCodeAt(pos)

Возвращает число (неотрицательное целое меньшее, чем 216), представляющее значениекода символа на позиции pos в строке, получающейся в результате преобразованияданного объекта к строке. Если на этой позиции символа нету, результатом являетсяNaN.

Когда функция charCodeAt вызывается с единственным аргументом pos, предпринимаютсяследующие шаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Вызвать ToInteger(pos).

3. Подсчитать количество символов в Результате(1).

4. Если Результат(2) меньше 0 или не меньше Результата(3) - вернуть NaN.

5. Вернуть значение типа Number, равное значению кода символа на позицииРезультат(2) в строке Результат(1). Первый (слева) символ Результата(1) считаетсянаходящимся на позиции 0, следующий - на позиции 1 и так далее.

ЗАМЕЧАНИЕФункция charCodeAt специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.6 String.prototype.concat([ string1[, string2 [,...]]])

Когда метод concat вызывается с нулём или более аргументами item1, item2 и т. д., онвозвращает строку, содержащую символы объекта (преобразованного в строку), закоторыми следуют символы каждого из аргументов string1, string2 и т.д. (причёмкаждый аргумент предварительно преобразовывается в строку). Результатом являетсястроковое значение (не объект String). Предпринимаются следующие шаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Пусть R равно Результату(1).

Page 155: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Получить следующий по списку аргумент. Если больше аргументов не осталось -переход на шаг 7.

4. Вызвать ToString(Результат(3)).

5. Пусть R - строковое значение, состоящее из символов предыдущего значения R, закоторым следуют символы Результата(4).

6. Переход на шаг 3.

7. Вернуть R.

Значение свойства length для метода concat равно 1.

ЗАМЕЧАНИЕФункция concat специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.7 String.prototype.indexOf(searchString, position)

Если searchString является подстрокой результата преобразования данного объекта встроку и встречается на одной или более позициях, больших чем или равных position, товозвращается индекс наименьшей из таких позиций. В ином случае возвращается -1.Если аргумент position равен undefined, он предполагается равным 0 и поискпроизводится по всей строке.

Метод indexOf принимает два аргумента, searchString и position и выполняет следующиешаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Вызвать ToString(searchString).

3. Вызвать ToInteger(position). (Если position равно undefined, этот шаг возвращаетзначение 0).

4. Подсчитать количество символов в Результате(1).

5. Вычислить min(max(Результат(3), 0), Результат(4)).

6. Подсчитать количество символов в строке, которой является Результат(2).

7. Вычислить наименьшее целое значение k, не меньшее, чем Результат(5), такое, что k+Результат(6) не больше, чем Результат(4), и для всех неотрицательных целых j, меньших,чем Результат(6), символ на позиции k+j Результата(1) равен символу на позиции jРезультата(2). Если такого целого k не найдётся - использовать значение -1.

8. Вернуть Результат(7).

Значение свойства length для метода indexOf равно 1.

ЗАМЕЧАНИЕФункция indexOf специально сделана не привязанной к типу. Она не требует, чтобы её

Page 156: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

значение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.8 String.prototype.lastIndexOf(searchString, position)

Если searchString является подстрокой результата преобразования данного объекта встроку и встречается на одной или более позициях, больших чем или равных position, товозвращается индекс наибольшей из таких позиций. В ином случае возвращается -1. Еслиаргумент position равен undefined, он предполагается равным длине строки и поискпроизводится по всей строке.

Метод lastIndexOf принимает два аргумента, searchString и position и выполняетследующие шаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Вызвать ToString(searchString).

3. Вызвать ToNumber(position). (Если position равно undefined, этот шаг возвращаетзначение NaN).

4. Если Результат(3) равен NaN - использовать +∞. Иначе, вызватьToInteger(Результат(3)).

5. Подсчитать количество символов в Результате(1).

6. Вычислить min(max(Результат(4), 0), Результат(5)).

7. Подсчитать количество символов в строке, которой является Результат(2).

8. Вычислить наибольшее целое неотрицательное значение k, не большее, чемРезультат(6), такое, что k+ Результат(7) не больше, чем Результат(5), и для всехнеотрицательных целых j, меньших, чем Результат(7), символ на позиции k+jРезультата(1) равен символу на позиции j Результата(2). Если такого целого k ненайдётся - использовать значение -1.

9. Вернуть Результат(8).

Значение свойства length для метода lastIndexOf равно 1.

ЗАМЕЧАНИЕФункция lastIndexOf специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.9 String.prototype.localeCompare(that)

Когда метод localeCompare вызывается с одним аргументом that, он возвращает число,отличное от NaN, которое представляет результат проведённого с учётом текущихязыковых настроек системы строкового сравнения данного объекта (преобразованного встроку) с that (преобразованным в строку). Алгоритм сравнения двух строк зависит отреализации. Подразумевается, что результат сравнения упорядочивает строки согласнопорядку, определённому текущими языковыми настройками системы, и имеет

Page 157: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

отрицательное, нулевое или положительное значение в зависимости от того, идёт ли thisперед that в этом порядке, равны ли строки или this идёт в этом порядке после thatсоответственно.

Метод localeCompare, если рассматривать его как функцию двух аргументов this и that,является последовательной функцией сравнения (согласно определению в 15.4.4.11) намножестве всевозможных строк. Кроме того, localeCompare возвращает 0 или -0, когдасравнивает две строки, которые считаются канонически эквивалентными согласностандарту Юникода.

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

ЗАМЕЧАНИЕ 1 Метод localeCompare не может быть использован напрямую в качестве аргумента дляArray.prototype.sort, так как последний требует функцию от двух аргументов.

ЗАМЕЧАНИЕ 2 Предполагается, что эта функция воспользуется той функциональностьюязыкозависимого сравнения, которая предоставляется среде ECMAScript внешней средойи что сравнение будет проводиться согласно правилам текущих языковых настроеквнешней среды. Настоятельно рекомендуется, чтобы функция обрабатывала строки,являющиеся канонически эквивалентными согласно стандарту Юникода, как идентичные(другими словами, сравнивала строки так, как будто они обе были предварительнопреобразованы в Нормализованную Форму C или D). Также рекомендуется, чтобыфункция не учитывала Юникодные сравнительные равенства или декомпозиции.

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

ЗАМЕЧАНИЕ 3 Функция localeCompare специально сделана не привязанной к типу. Она не требует, чтобыеё значение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

ЗАМЕЧАНИЕ 4 Второй аргумент этой функции, скорее всего, будет задействован в следующей версииданного стандарта. Реализациям не рекомендуется использовать эту позицию спискааргументов для чего-либо ещё.

15.5.4.10 String.prototype.match(regexp)

Если значение аргумента regexp не является объектом, значение свойства [[Class]]которого равно "RegExp", оно заменяется на результат вычисления выражения new RegExp(regexp). Пусть string обозначает результат преобразования значения this к строке. Тогдавыполнить одно из следующих действий:

Если regexp. global равно false - вернуть результат вызова RegExp.prototype.exec (см.раздел 15.10.6.2) для regexp с string в качестве параметра.

Page 158: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Если regexp. global равно true - установить свойство regexp.lastIndex в 0 ипоследовательно вызывать RegExp.prototype.exec, пока оно может найти соответствие.Если соответствие найдено с пустой строкой (иными словами, значение regexp.lastIndex остаётся неизменным), увеличить regexp. lastIndex на 1. Пусть n - числонайденных соответствий. Если n=0 - вернуть значение null. Иначе, вернуть массивсо значением свойства length равным n и значениями свойств от 0 до n-1соответствующими первым элементам результатов всех вызововRegExp.prototype.exec, находивших соответствие.

ЗАМЕЧАНИЕФункция match специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.11 String.prototype.replace(searchValue, replaceValue)

Пусть string обозначает результат преобразования значения this к строке.

Если searchValue - регулярное выражение (т.е. объект, значение свойства [[Class]] длякоторого равно "RegExp"), выполнить следующее: Если searchValue. global равно false -произвести поиск в string и найти первое соответствие для регулярного выраженияsearchValue. Если searchValue.global равно true - произвести поиск в string и найти всесоответствия для регулярного выражения searchValue. Поиск должен производиться также, как и в String.prototype.match, включая обновление значения searchValue. lastIndex.Пусть m - количество левых захватывающих группирующих скобок в searchValue(NCapturingParens согласно описанию в разделе 15.10.2.1).

Если searchValue - не регулярное выражение, то приравнять searchString =ToString(searchValue) и произвести поиск в string первого вхождения строкиsearchString. Пусть m равно 0.

Если replaceValue - функция, то для каждой найденной подстроки вызвать функцию соследующими m + 3 аргументами. Аргумент 1 - найденная подстрока. Если searchValue -регулярное выражение, то следующие m аргументов имеют значения захваченных группв MatchResult (см. раздел 15.10.2.1). Аргумент m + 2 равен смещению в string, накотором нашлось соответствие, а аргумент m + 3 равен string. Результатом являетсястроковое значение, полученное из первоначального входного путём замены каждойнайденной подстроки на результат соответствующего вызова функции, преобразованныйпри необходимости в строку.

Иначе, пусть newstring означает результат преобразования replaceValue в строку.Результатом является строковое значение, полученное из первоначального входногопутём замены каждой найденной подстроки на строку, полученную из newstring путёмзамены символов newstring на заменяющий текст согласно нижеприведённой таблице.Эти $-замены производятся слева направо и нерекурсивно: после произведения замены,попыток повторить замену в заменяющем тексте уже не предпринимается. Например,"$1,$2".replace(/(\$(\d))/g, "$$1-$1$2") возвращает "$1-$11,$1-$22". Символ $ в newstring,который не подходит ни к одной из нижеприведённых форм, остаётся в том виде, вкотором есть.

Символы Заменяющий текст$$ $

Page 159: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

$& Найденная подстрока.$` Часть string, которая предшествует найденной подстроке.$' Часть string, которая следует за найденной подстрокой.

$n

Результат захвата n-й группой, где n - одиночная цифра от 1 до 9 и за $n неследует десятичных цифр. Если n <= m, а результат n-го захвата равенundefined - вместо него используется пустая строка. Если n> m - результатзависит от реализации.

$nnРезультат захвата nn-й группой, где nn - двухзначное десятичное число от 01до 99. Если nn<= m, а регультат nn-го захвата равен undefined - вместо негоиспользуется пустая строка. Если nn> m - результат зависит от реализации.

ЗАМЕЧАНИЕФункция replace специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.12 String.prototype.search(regexp)

Если значение аргумента regexp не является объектом, значение свойства [[Class]]которого равно "RegExp", оно заменяется на результат вычисления выражения new RegExp(regexp). Пусть string обозначает результат преобразования значения this к строке. Вstring производится поиск вхождения шаблона регулярного выражения regexp.Результатом является число, указывающее на какой позиции в string нашлосьсоответствие шаблону, или -1 , если соответствия не нашлось.

ЗАМЕЧАНИЕ 1 Этот метод игнорирует свойства lastIndex и global объекта regexp. Свойство lastIndexобъекта regexp остаётся без изменения.

ЗАМЕЧАНИЕ 2 Функция charAt специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.13 String.prototype.slice(start, end)

Метод slice принимает два аргумента start и end, преобразовывает данный объект кстроке и возвращает её подстроку, начинающуюся с символа на позиции start ипродолжающуюся до символа на позиции end не включительно (или до конца строки,если end равно undefined). Если start отрицательно, вместо него используется значение(sourceLength+ start), где sourceLength равно длине строки. Если аргумент endотрицателен, вместо него используется значение (sourceLength+ end), где sourceLengthравно длине строки. Результатом является строковое значение (не объект String).Предпринимаются следующие шаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Подсчитать количество символов в Результате(1).

3. Вызвать ToInteger(start).

Page 160: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

4. Если end равно undefined, использовать Результат(2). Иначе использоватьToInteger(end).

5. Если значение Результата(3) отрицательно, использовать max((Результат(2)+Результат(3)), 0). Иначе использовать min(Результат(3), Результат(2)).

6. Если значение Результата(4) отрицательно, использовать max((Результат(2)+Результат(4)), 0). Иначе использовать min(Результат(4), Результат(2)).

7. Вычислить max(Результат(6)- Результат(5), 0).

8. Вернуть строку, содержащую Результат(7) последовательно идущих символоаРезультата(1), начиная с символа на позиции Результат(5).

Значение свойства length для метода slice равно 2.

ЗАМЕЧАНИЕФункция slice специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.14 String.prototype.split(separator, limit)

Вернуть объект типа Array, в котором хранятся подстроки результата преобразованияданного объекта в строку. Подстроки определяются путём поиска в строке слеванаправо вхождений разделителя separator; эти вхождения не включаются врезультирующие подстроки, но служат для разделения строкового значения. Значениемseparator может быть строка любой длины или объект типа RegExp (т. е. объект,значением свойства [[Class]] которого является "RegExp"; см. раздел 15.10).

Значением separator может быть пустая строка, пустое регулярное выражение илирегулярное выражение, которое соответствует любой строке. В этом случае separator несчитается соответствующим началу или концу входной строки и не считаетсясоответствующим пустой строке в конце предыдущего соответствия разделителю.(Например, если separator является пустой строкой, строка разбивается на отдельныесимволы, длина результирующего массива равняется длине строки и каждая подстрокасодержит по одному символу.) Если separator - регулярное выражение, для каждойпозиции в строке this используется только первое соответствие, даже если переборомможно найти непустую соответствующую строку в этой позиции. (Например,"ab".split(/a*?/) даёт результат ["a","b"], но "ab".split(/a*/) даёт результат ["","b"]).

Если объект this равен (или преобразуется к) пустой строке, результат зависит от того,может ли separator соответствовать пустой строке. Если может, то результирующиймассив не содержит элементов. Иначе результирующий массив содержит один элемент,представляющий из себя пустую строку.

Если separator является регулярным выражением, содержащим захватывающиегруппирующие скобки, то каждый раз, когда для separator находится соответствие,результаты (включая результаты со значением undefined) захвата группирующимискобками вставляются в выходной массив. (Например,"A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/) даёт результат ["A", undefined,"B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""].)

Page 161: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Если значение separator равно undefined, то результирующий массив содержит толькоодну строку, равную значению this (преобразованному к строке). Если limit не равноundefined, то выходной массив усекается так, чтобы содержать не более чем limitэлементов.

Когда вызывается метод split, предпринимаются следующие шаги:

1. Пусть S = ToString(this).

2. Пусть A - новый массив, как он был бы создан выражением new Array().

3. Если значение limit равно undefined, приравнять lim =232 -1, иначе приравнять lim =ToUint32(limit).

4. Пусть s - число символов в строке S.

5. Пусть p=0.

6. Если separator - объект типа RegExp (его свойство [[Class]] равно "RegExp"), приравнятьR = separator, иначе приравнять R = ToString(separator).

7. Если lim = 0 - вернуть A.

8. Если separator равен undefined - переход на шаг 33.

9. Если s = 0 - переход на шаг 31.

10. Положить q = p.

11. Если q = s - переход на шаг 28.

12. Вызвать SplitMatch(R, S, q) и положить z равным её результату (типа MatchResult).

13. Если z равно failure - переход на шаг 26.

14. Теперь z должно иметь тип State. Пусть e равно endIndex в z и пусть cap равномассиву captures в z.

15. Если e = p - переход на шаг 26.

16. Пусть T - строковое значение, эквивалентное подстроке S, состоящей из символов напозициях с p (включительно) по q (не включительно).

17. Вызвать метод [[Put]] объекта A с аргументами A.length и T.

18. Если A.length = lim - вернуть A.

19. Пусть p = e.

20. Пусть i =0.

21. Если i равно числу элементов в cap - переход на шаг 10.

22. Пусть i = i + 1.

Page 162: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

23. Вызвать метод [[Put]] объекта A с аргументами A. length и cap[i].

24. Если A. length = lim - вернуть A.

25. Переход на шаг 21.

26. Пусть q = q + 1.

27. Переход на шаг 11.

28. Пусть T - строковое значение, равное подстроке S, состоящей из символов напозициях с p (включительно) по s (исключительно).

29. Вызвать метод [[Put]] объекта A с аргументами A. length и T.

30. Вернуть A.

31. Вызвать SplitMatch(R, S, 0) и положить z равным её результату (типа MatchResult).

32. Если z не равно failure - вернуть A.

33. Вызвать метод [[Put]] объекта A с аргументами "0" и S.

34. Вернуть A.

Внутренняя вспомогательная функция SplitMatch принимает три аргумента (строку S,целое q и строку или RegExp R) и выполняет следующие действия, с тем чтобы вернутьзначение типа MatchResult (см. 15.10.2.1):

1. Если R - объект типа RegExp (его [[Class]] равен "RegExp") - переход на шаг 8.

2. R должен быть строкой. Пусть r - число символов в R.

3. Пусть s - число символов в строке S.

4. Если q + r > s - вернуть значение MatchResult failure.

5. Если существует такое целое i от 0 (включительно) до r (не включительно), такое, чтосимвол строки S на позиции q + i отличен от символа строки R на позиции i - вернутьfailure.

6. Пусть cap - пустой массив захваченных подстрок (см. раздел 15.10.2.1).

7. Вернуть State (q + r, cap). (см. раздел 15.10.2.1)

8. Вызвать метод [[Match]] объекта R, передав ему аргументы S и q, и вернув результаттипа MatchResult.

Значение свойства length для метода split равно 2.

ЗАМЕЧАНИЕ 1 Функция split специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

Page 163: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ЗАМЕЧАНИЕ 2 Метод split игнорирует значение свойства separator. global в случае, если separator -объект типа RegExp.

15.5.4.15 String.prototype.substring(start, end)

Метод substring принимает два аргумента start и end и возвращает подстрокурезультата преобразования данного объекта к сроке, начинающуюся с символа напозиции start и продолжающуюся до символа на позиции end не включительно (или доконца строки, если end равно undefined). Результат является строковым значением, а необъектом типа String.

Если какой-либо из агрументов равен NaN или отрицателен, он заменяется на 0. Есликакой-либо из аргументов больше длины строки, он заменяется на длину строки.

Если start больше end, они меняются местами. Предпринимаются следующие шаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Подсчитать количество символов в Результате(1).

3. Вызвать ToInteger(start).

4. Если end равно undefined, использовать Результат(2). Иначе использоватьToInteger(end).

5. Вычислить min(max(Результат(3), 0), Результат(2)).

6. Вычислить min(max(Результат(4), 0), Результат(2)).

7. Вычислить min(Результат(5), Результат(6)).

8. Вычислить max(Результат(5), Результат(6)).

9. Вернуть строку, длина которой равняется разности между Результатом(8) иРезультатом(7), содержащую символы Результата(1), а именно символы с индексами отРезультата(7) до Результата(8) - 1, в восходящем порядке.

Значение свойства length для метода substring равно 2.

ЗАМЕЧАНИЕФункция substring специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.16 String.prototype.toLowerCase()

Если данный объект не является строкой, он преобразовывается к строке. Каждый символэтой строки последовательно преобразуется к нижнему регистру. Результатом являетсястроковое значение (не объект String).

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

Page 164: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

регистра согласно Юникоду. В противном случае используется этот эквивалент.

ЗАМЕЧАНИЕ 1 Результат должен быть получен согласно регистровым отображениям базы данныхсимволов Юникода (которая явно включает не только файл UnicodeData. txt, но и файлSpecialCasings. txt, добавленный к первому в Юникоде 2.1.8 и более поздних версиях).

ЗАМЕЧАНИЕ 2 Функция toLowerCase специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.17 String.prototype.toLocaleLowerCase()

Функция работает полностью аналогично toLowerCase, за тем исключением, что еёрезультат должен быть корректным согласно текущим языковым настройкам системы, ане быть независимым от языковых настроек. Различия будут наблюдаться лишь внекоторых случаях (например, для турецкого языка), когда правила языка противоречатстандартным регистровым отображениям Юникода.

ЗАМЕЧАНИЕ 1 Функция toLocaleLowerCase специально сделана не привязанной к типу. Она не требует,чтобы её значение this было объектом типа String. Таким образом, она может бытьпередана другим типам объектов для использования в качестве метода.

ЗАМЕЧАНИЕ 2 Первый аргумент этой функции, скорее всего, будет задействован в следующей версииданного стандарта. Реализациям не рекомендуется использовать эту позицию спискааргументов для чего-либо ещё.

15.5.4.18 String.prototype.toUpperCase()

Функция ведёт себя полностью аналогично String.prototype.toLowerCase, за исключениемтого, что символы отображаются на соответствующие им аналоги верхнего регистрасогласно определениям в базе данных символов Юникода.

ЗАМЕЧАНИЕ 1 Поскольку поведение и toUpperCase, и toLowerCase зависит от контекста, эти функции неявляются симметричными. Другими словами, s.toUpperCase(). toLowerCase() необязательно совпадает с s.toLowerCase().

ЗАМЕЧАНИЕ 2 Функция toUpperCase специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

15.5.4.19 String.prototype.toLocaleUpperCase()

Функция работает полностью аналогично toUpperCase, за тем исключением, что еёрезультат должен быть корректным согласно текущим языковым настройкам системы, ане быть независимым от языковых настроек. Различия будут наблюдаться лишь внекоторых случаях (например, для турецкого языка), когда правила языка противоречатстандартным регистровым отображениям Юникода.

Page 165: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ЗАМЕЧАНИЕ 1 Функция toLocaleUpperCase специально сделана не привязанной к типу. Она не требует,чтобы её значение this было объектом типа String. Таким образом, она может бытьпередана другим типам объектов для использования в качестве метода.

ЗАМЕЧАНИЕ 2 Первый аргумент этой функции, скорее всего, будет задействован в следующей версииданного стандарта. Реализациям не рекомендуется использовать эту позицию спискааргументов для чего-либо ещё.

15.5.5 Свойства экземпляров String

Экземпляры типа String наследуют свойства с объекта-прототипа String, а такжеобладают свойствами [[Value]] и length.

Свойство [[Value]] равняется строковому значению, представленному объектом типаString.

15.5.5.1 length

Число символов в строке, представленной данным объектом типа String.

После создания объекта String это свойство остаётся неизменным. Оно обладаетсвойствами { DontEnum, DontDelete, ReadOnly }.

15.6 Объекты типа Boolean15.6.1 Вызов конструктора Boolean как функции

Когда Boolean вызывается не как конструктор, а как функция, он производитпреобразование типа.

15.6.1.1 Boolean(value)

Возвращает булевское значение (не объект Boolean), вычисляемое как ToBoolean(value).

15.6.2 Конструктор Boolean

Когда Boolean вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.6.2.1 new Boolean(value)

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Boolean, т.е. тому, который представляет собой первоначальноезначение Boolean.prototype (см. раздел 15.6.3.1).

Свойство [[Class]] создаваемого объекта устанавливается в "Boolean".

Свойство [[Value]] создаваемого объекта устанавливается в ToBoolean(value).

15.6.3 Свойства конструктора Boolean

Значением внутреннего свойства [[Prototype]] конструктора Boolean является объект-

Page 166: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

прототип Function (см. раздел 15.3.4).

Кроме внутренних свойств и свойства length (значение которого равно 1), конструкторBoolean обладает следующими свойствами:

15.6.3.1 Boolean.prototype

Начальным значением Boolean.prototype является объект-прототип Boolean (см. раздел15.6.4).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.6.4 Свойства объекта-прототипа Boolean

Объектом-прототипом Boolean является также объект Boolean (его [[Class]] равен"Boolean"), значением которого является false.

Значением внутреннего свойства [[Prototype]] объекта-прототипа Boolean являетсяобъект-прототип Object (15.2.3.1).

В последующих описаниях функций, являющихся свойствами объекта-прототипаBoolean, словосочетание "данный объект Boolean" относится к значению this,переданному при вызове этой функции. Если значение this не является объектом, длякоторого значением внутреннего свойства [[Class]] является "Boolean", бросаетсяисключение TypeError. Фраза "данное булевское значение" относится к булевскомузначению, представляемому данным объектом типа Boolean, т.е. к значению внутреннегосвойства [[Value]] данного объекта Boolean.

15.6.4.1 Boolean.prototype.constructor

Начальным значением Boolean.prototype.constructor является встроенный конструкторBoolean.

15.6.4.2 Boolean.prototype.toString()

Если данное булевское значение равно true, возвращается строка "true". В ином случае,данное булевское значение должно равняться false и возвращается строка "false".

Функция toString привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа Boolean. Таким образом, она неможет быть передана другим типам объектов для использования в качестве метода.

15.6.4.3 Boolean.prototype.valueOf()

Возвращает булевское значение.

Функция valueOf привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа Boolean. Таким образом, она неможет быть передана другим типам объектов для использования в качестве метода.

15.6.5 Свойства экземпляров Boolean

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

Page 167: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.7 Объекты типа Number15.7.1 Вызов конструктора Number как функции

Когда Number вызывается не как конструктор, а как функция, он производитпреобразование типа.

15.7.1.1 Number([ value ] )

Возвращает численное значение (не объект Number), вычисляемое как ToNumber(value).Если значения value передано не было, возвращает +0.

15.7.2 Конструктор Number

Когда Number вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.7.2.1 new Number([ value ] )

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Number, т.е. тому, который представляет собой первоначальноезначение Number.prototype (см. раздел 15.7.3.1).

Свойство [[Class]] создаваемого объекта устанавливается в "Number".

Свойство [[Value]] создаваемого объекта устанавливается в ToNumber(value). Еслизначения value передано не было, используется значение +0.

15.7.3 Свойства конструктора Number

Значением внутреннего свойства [[Prototype]] конструктора Number является объект-прототип Function (см. раздел 15.3.4).

Кроме внутренних свойств и свойства length (значение которого равно 1), конструкторNumber обладает следующими свойствами:

15.7.3.1 Number.prototype

Начальным значением Number.prototype является объект-прототип Number (см. раздел15.7.4).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.7.3.2 Number.MAX_VALUE

Значением Number.MAX_VALUE является наибольшее конечное положительное значениечисленного типа, приблизительно равное 1.7976931348623157 * 10308 .

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.7.3.3 Number.MIN_VALUE

Значением Number.MIN_VALUE является наименьшее положительное значение численноготипа, приблизительно равное 5 * 10-324 .

Page 168: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.7.3.4 Number.NaN

Значением Number.NaN является NaN.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.7.3.5 Number.NEGATIVE_INFINITY

Значением Number.NEGATIVE_INFINITY является -∞.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.7.3.6 Number.POSITIVE_INFINITY

Значением Number.POSITIVE_INFINITY является +∞.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.7.4 Свойства объекта-прототипа Number

Объектом-прототипом Number является также объект Number (его [[Class]] равен"Number"), значением которого является +0.

Значением внутреннего свойства [[Prototype]] объекта-прототипа Number являетсяобъект-прототип Object (15.2.3.1).

В последующих описаниях функций, являющихся свойствами объекта-прототипаNumber, словосочетание "данный объект Number" относится к значению this,переданному при вызове этой функции. Если значение this не является объектом, длякоторого значением внутреннего свойства [[Class]] является "Number", бросаетсяисключение TypeError. Фраза "данное численное значение" относится к численномузначению, представляемому данным объектом типа Number, т.е. к значению внутреннегосвойства [[Value]] данного объекта Number.

15.7.4.1 Number.prototype.constructor

Начальным значением Number.prototype.constructor является встроенный конструкторNumber.

15.7.4.2 Number.prototype.toString(radix)

Если radix является числом 10 или равен undefined, то данное численное значениепередаётся в качестве аргумента оператору ToString. Полученное строковое значениезатем возвращается.

Если radix - целое в диапазоне от 2 до 36, но не равное 10, результатом является строка,выбор которой зависит от реализации.

Функция toString привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа Number. Таким образом, она неможет быть передана другим типам объектов для использования в качестве метода.

Page 169: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.7.4.3 Number.prototype.toLocaleString()

Возвращает строковое значение, представляющее значение объекта типа Number,форматированное согласно текущим языковым настройкам системы. Функция зависит отконкретной реализации, и ей разрешается (но не рекомендуется) возвращать то жезначение, что и toString.

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

15.7.4.4 Number.prototype.valueOf()

Возвращает численное значение.

Функция valueOf привязана к данному типу. Она бросает исключение TypeError, еслипереданное ей значение this не является объектом типа Number. Таким образом, она неможет быть передана другим типам объектов для использования в качестве метода.

15.7.4.5 Number.prototype.toFixed(fractionDigits)

Возвращает строку, содержащую число, представленное в записи с фиксированнойточкой, с fractionDigits цифр после десятичной точки. Если fractionDigits равноundefined, предполагается значение 0. Выполнить следующие шаги:

1. Пусть f равно ToInteger(fractionDigits). (Если fractionDigits равно undefined, этот шагдаёт значение 0).

2. Если f < 0 или f > 20 - бросить исключение RangeError.

3. Пусть x - данное численное значение.

4. Если x равно NaN - вернуть строку "NaN".

5. Пусть s - пустая строка.

6. Если x >= 0 - переход на шаг 9.

7. Пусть s равно "-".

8. Пусть x =- x.

9. Если x >= 1021, приравнять m = ToString(x) и перейти на шаг 20.

10. Пусть n - целое, для которого точное математическое значение n ÷ 10f - x являетсянаиболее близким к 0. Если существуют два таких n, выбрать из них большее.

11. Если n =0, пусть m равно строке "0". Иначе, пусть m равно строке, состоящей издесятичного представления n (по порядку, без начальных нулей).

12. Если f =0 - переход на шаг 20.

Page 170: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

13. Пусть k - число символов в m.

14. Если k > f - переход на шаг 18.

15. Пусть z - строка, состоящая из f+ 1 - k повторений символа '0'.

16. Пусть m - конкатенация строк z и m.

17. Пусть k = f + 1.

18. Пусть a - первые k - f символов m, а b - остальные f символов m.

19. Пусть m - конкатенация трёх строк a, ".", и b.

20. Вернуть конкатенацию строк s и m.

Значение свойства length для метода toFixed равно 1.

Если метод toFixed вызывается с более чем одним аргументом, его поведение неопределено (см. раздел 15).

Реализациям позволяется расширять поведение toFixed для значений fractionDigitsменьших 0 или больших 20. В этом случае toFixed не должна обязательно бросатьисключение RangeError для таких значений.

ЗАМЕЧАНИЕВывод toFixed для некоторых значений может быть более точным, чем вывод toString,потому что toString выводит только такое количество значащих цифр, котороенеобходимо, чтобы отличить данное число от соседних численных значений. Например,(1000000000000000128).toString() возвращает "1000000000000000100", а(1000000000000000128).toFixed(0) возвращает "1000000000000000128".

15.7.4.6 Number.prototype.toExponential(fractionDigits)

Возвращает строку, содержащую число, представленное в экспоненциальной записи сфиксированной точкой, с fractionDigits цифр после десятичной точки. Если fractionDigitsравно undefined - включить столько значащих цифр, сколько необходимо для тогочтобы однозначно определить число (так же, как и в ToString, за исключением того, что вданном случае число всегда выводится в экспоненциальной записи). Выполнитьследующие шаги:

1. Пусть x - данное численное значение.

2. Пусть f равно ToInteger(fractionDigits).

3. Если x равно NaN - вернуть строку "NaN".

4. Пусть s - пустая строка.

5. Если x >= 0 - переход на шаг 8.

6. Пусть s равно "-".

7. Пусть x =- x.

Page 171: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

8. Если x = +∞, присвоить m = "Infinity" и перейти на шаг 30.

9. Если fractionDigits равно undefined - перейти на шаг 14.

10. Если f < 0 или f > 20 - бросить исключение RangeError.

11. Если x = 0 - переход на шаг 16.

12. Пусть e и n - такие целые, что 10f <= n <10f+1, и для которых точноематематическое значение n * 10e- f - x является как можно более близким к 0. Еслисуществуют две таких пары e и n - выбрать такие e и n, для которых n * 10e- f больше.

13. Переход на шаг 20.

14. Если x != 0 - переход на шаг 19.

15. Пусть f = 0.

16. Пусть m - строка, состоящая из f + 1 повторений символа '0'.

17. Пусть e = 0.

18. Переход на шаг 21.

19. Пусть e, n и f - целые, такие, что f >= 0, 10f <= n <10f+ 1, численное значение для n* 10e- f равно x и f при этом имеет наименьшее из возможных значений. Заметим, чтодесятичное представление n имеет f + 1 цифр, n не делится на 10, и что младшийдесятичный разряд n не обязательно однозначно определяется этими критериями.

20. Пусть m - строка, состоящая из n (по порядку, без начальных нулей).

21. Если f = 0 - переход на шаг 24.

22. Пусть a - первый символ m, и пусть b - оставшиеся f символов m.

23. Пусть m - конкатенация трёх строк a, ".", и b.

24. Если e =0 - присвоить c = "+", d = "0" и перейти на шаг 29.

25. Если e > 0 - присвоить c = "+" и перейти на шаг 28.

26. Пусть c = "-".

27. Пусть e =- e.

28. Пусть d - строка, состоящая из цифр десятичного представления e (по порядку, безначальных нулей).

29. Пусть m - конкатенация четырёх строк m, "e", c и d.

30. Вернуть конкатенацию строк s и m. Значение свойства length для метода toExponentialравно 1.

Page 172: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Если метод toExponential вызывается с более чем одним аргументом, его поведение неопределено (см. раздел 15).

Реализациям позволяется расширять поведение toExponential для значений fractionDigitsменьших 0 или больших 20. В этом случае toExponential не должна обязательно бросатьисключение RangeError для таких значений.

ЗАМЕЧАНИЕДля реализаций, которые обеспечивают более точные преобразования, чем требуемые вправилах выше, рекомендуется использовать следующую альтернативную версию шага19:

Пусть e, n и f - такие целые, что f >= 0, 10f <= n <10f+1, численное значение n * 10e-f

равно x и f при этом имеет наименьшее из возможных значений. Если существуетнесколько подходящих значений для n - выбрать из них то, для которого значение n *10e-f является ближайшим к x. Если существует два таких возможных значения n -выбрать из них чётное.

15.7.4.7 Number.prototype.toPrecision(precision)

Возвращает строку, содержащую число, представленное либо в экспоненциальной записис одной цифрой перед фиксированной точкой и precision-1 цифр после десятичнойточки, или в записи с фиксированной точкой с precision значащих цифр. Если precisionравно undefined - вызвать функцию ToString (см. раздел 9.8.1) и вернуть результатвызова. Выполнить следующие шаги:

1. Пусть x - данное численное значение.

2. Если precision равно undefined - вернуть ToString(x).

3. Пусть p равно ToInteger(precision).

4. Если x равно NaN - вернуть строку "NaN".

5. Пусть s - пустая строка.

6. Если x >= 0 - переход на шаг 9.

7. Пусть s равно "-".

8. Пусть x = -x.

9. Если x = +∞, присвоить m = "Infinity" и перейти на шаг 30.

10. Если p <1 или p > 21 - бросить исключение RangeError.

11. Если x != 0 - переход на шаг 15.

12. Пусть m - строка, состоящая из p повторений символа '0'.

13. Пусть e = 0.

14. Переход на шаг 18.

Page 173: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15. Пусть e и n - такие целые, что 10p-1 <= n <10p, и для которых точноематематическое значение n * 10e-p+1 - x является как можно более близким к 0. Еслисуществуют две таких пары e и n - выбрать такие e и n, для которых n * 10e-p+1 больше.

16. Пусть m - строка, состоящая из n (по порядку, без начальных нулей).

17. Если e <-6 или e >= p - переход на шаг 22.

18. Если e = p-1 - переход на шаг 30.

19. Если e >= 0, приравнять m конкатенации первых e + 1 символов m, символа '. ' иоставшихся p-(e+1) символов m и перейти на шаг 30.

20. Пусть m - конкатенация строки "0.", -( e+1) повторений символа '0' и строки m.

21. Переход на шаг 30.

22. Пусть a - первый символ m, и пусть b - оставшиеся p-1 символов m.

23. Пусть m - конкатенация трёх строк a, ".", и b.

24. Если e =0 - присвоить c = "+", d = "0" и перейти на шаг 29.

25. Если e > 0 - присвоить c = "+" и перейти на шаг 28.

26. Пусть c = "-".

27. Пусть e =- e.

28. Пусть d - строка, состоящая из цифр десятичного представления e (по порядку, безначальных нулей).

29. Пусть m - конкатенация четырёх строк m, "e", c и d.

30. Вернуть конкатенацию строк s и m.

Значение свойства length для метода toPrecision равно 1.

Если метод toPrecision вызывается с более чем одним аргументом, его поведение неопределено (см. раздел 15).

Реализациям позволяется расширять поведение toPrecision для значений precisionменьших 1 или больших 21. В этом случае toPrecision не должна обязательно бросатьисключение RangeError для таких значений.

15.7.5 Свойства экземпляров Number

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

15.8 Объект Math

Объект Math - единичный объект, у которого есть несколько именованных свойств,некоторые из которых являются функциями.

Page 174: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значением внутреннего свойства [[Prototype]] объекта Math является объект-прототипObject (15.2.3.1). Значением внутреннего свойства [[Class]] объекта Math является "Math".

У объекта Math нет свойства [[Construct]]. Объект Math невозможно использовать вкачестве конструктора с оператором new.

У объекта Math нет свойства [[Call]]. Объект Math невозможно вызвать как функцию.

ЗАМЕЧАНИЕВ данной спецификации фраза "численное значение x" имеет техническое значение,определённое в разделе 8.5.

15.8.1 Свойства-значения объекта Math15.8.1.1 E

Численное значение e, основания натурального логарифма, приблизительно равное2.7182818284590452354.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.8.1.2 LN10

Численное значение натурального логарифма 10, приблизительно равное2.302585092994046.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.8.1.3 LN2

Численное значение натурального логарифма 2, приблизительно равное0.6931471805599453.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.8.1.4 LOG2E

Численное значение логарифма e (основания натурального логарифма) по основанию 2,приблизительно равное 1.4426950408889634.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

ЗАМЕЧАНИЕЗначение Math.LOG2E приблизительно равняется обратному значению Math.LN2.

15.8.1.5 LOG10E

Численное значение логарифма e (основания натурального логарифма) по основанию 10,приблизительно равное 0.4342944819032518.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

ЗАМЕЧАНИЕ

Page 175: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение Math.LOG10E приблизительно равняется обратному значению Math.LN10.

15.8.1.6 PI

Численное значение π, отношения длины окружности к её диаметру, приблизительноравное 3.1415926535897932.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.8.1.7 SQRT1_2

Численное значение квадратного корня из 1/2, приблизительно равное0.7071067811865476.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

ЗАМЕЧАНИЕЗначение Math.SQRT1_ 2 приблизительно равняется обратному значению Math.SQRT2.

15.8.1.8 SQRT2

Численное значение квадратного корня из 2, приблизительно равное1.4142135623730951.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.8.2 Свойства-функции объекта Math

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

В нижеописанных функциях, обозначения NaN, -0, +0, -∞ и +∞ ссылаются на численныезначения, описанные в разделе 8.5.

ЗАМЕЧАНИЕПоведение функций acos, asin, atan, atan2, cos, exp, log, pow, sin и sqrt неописывается здесь во всех деталях, за исключением требования возвращенияопределённых значений для определённых значений аргументов, представляющихграничные случаи, заслуживающие особого рассмотрения. Для прочих значенийаргументов эти функции должны вычислять приближения к результатам общеизвестныхматематических функций, однако в выборе конкретных алгоритмов приближениядопускается некоторая свобода. В целом, подразумевается, что создатель реализациидолжен иметь возможность на любой данной платформе воспользоваться для ECMAScriptтой же математической библиотекой, что доступна на этой платформе программистам наязыке C.

Хотя выбор алгоритмов зависит от конкретной реализации, рекомендуется (но непредписывается данным стандартом), чтобы аппроксимации использовали алгоритмыприближения для арифметики IEEE 754, содержащиеся в fdlibm, свободнораспространяемой математической библиотеке от Sun Microsystems ([email protected]). Также данная спецификация требует определённыхрезультатов для определённых значений аргументов, представляющих граничные

Page 176: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

случаи, заслуживающие особого рассмотрения.

15.8.2.1 abs(x)

Вернуть абсолютное значение x; результат имеет тот же модуль, что и x, но взят сознаком плюс.

Если x равно NaN - результат равен NaN.Если x равно -0 - результат равен +0.Если x равно -∞ - результат равен +∞.

15.8.2.2 acos(x)

Вернуть зависящее от реализации приближение арккосинуса x. Результат выражен врадианах и находится в диапазоне от +0 до +π.

Если x равно NaN - результат равен NaN.Если x больше 1 - результат равен NaN.Если x меньше -1 - результат равен NaN.Если x в точности равно 1 - результат равен +0.

15.8.2.3 asin(x)

Вернуть зависящее от реализации приближение арксинуса x. Результат выражен врадианах и находится в диапазоне от -π/2 до +π/2.

Если x равно NaN - результат равен NaN.Если x больше 1 - результат равен NaN.Если x меньше -1 - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.

15.8.2.4 atan(x)

Вернуть зависящее от реализации приближение арктангенса x. Результат выражен врадианах и находится в диапазоне от -π/2 до +π/2.

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.Если x равно +∞ - результат равен зависящему от реализации приближению +π/2.Если x равно +∞ - результат равен зависящему от реализации приближению -π/2.

15.8.2.5 atan2(y, x)

Возвращает зависящее от реализации приближение к арктангенсу частного y/xаргументов y и x, причём знаки y и x используются для определения квадрантарезультата. Заметим, что такой порядок аргументов (первый y, второй x) выбраннамеренно и является традиционным для функции арктангенса двух аргументов.Результат выражен в радианах и находится в диапазоне от -π до +π.

Если x или y равно NaN - результат равен NaN.Если y> 0, а x равно +0 - результат равен зависящему от реализации приближению

Page 177: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

+π/2.Если y> 0, а x равно -0 - результат равен зависящему от реализации приближению+π/2.Если y равно +0, а x> 0 - результат равен +0.Если y равно +0 и x равно +0 - результат равен +0.Если y равно +0, а x равно -0 - результат равен зависящему от реализацииприближению +π.Если y равно +0, а x <0 - результат равен зависящему от реализации приближению+π.Если y равно -0, а x >0 - результат равен -0.Если y равно -0 и x равно +0 - результат равен -0.Если y равно -0 и x равно -0 - результат равен зависящему от реализацииприближению -π.Если y равно -0, а x<0 - результат равен зависящему от реализации приближению -π.Если y<0, а x равно +0 - результат равен зависящему от реализации приближению-π/2.Если y<0, а x равно -0 - результат равен зависящему от реализации приближению -π/2.Если y>0, y конечно, а x равно +∞ - результат равен +0.Если y> 0, y - конечно, а x равно -∞ - результат равен зависящему от реализацииприближению +π.Если y< 0, y - конечно, а x равно +∞ - результат равен -0.Если y<0, y - конечно, а x равно -∞ - результат равен зависящему от реализацииприближению -π.Если y равно +∞, а x конечно - результат равен зависящему от реализацииприближению +π/2.If y равно -∞, а x конечно - результат равен зависящему от реализацииприближению -π/2.Если y равно +∞ и x равно +∞ - результат равен зависящему от реализацииприближению +π/4.Если y равно +∞ и x равно -∞ - результат равен зависящему от реализацииприближению +3π/4.Если y равно -∞ и x равно +∞ - результат равен зависящему от реализацииприближению -π/4.Если y равно -∞ и x равно -∞ - результат равен зависящему от реализацииприближению -3π/4.

15.8.2.6 ceil(x)

Вернуть наименьшее (ближайшее к -∞) численное значение, не меньшее x и являющеесяматематическим целым. Если x уже целое - вернуть x.

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.Если x равно +∞ - результат равен +∞.Если x равно -∞ - результат равен -∞.Если x меньше 0, но больше чем -1 - результат равен -0.

Значение Math.ceil(x) совпадает со значением -Math.floor(-x).

Page 178: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.8.2.7 cos(x)

Вернуть зависящее от реализации приближение косинуса x. Аргумент выражен врадианах.

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен 1.Если x равно -0 - результат равен 1.Если x равно +∞ - результат равен NaN.Если x равно -∞ - результат равен NaN.

15.8.2.8 exp(x)

Возвращает зависящее от реализации приближение к экспоненте x (e в степени x, где e -основание натурального логарифма).

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен 1.Если x равно -0 - результат равен 1.Если x равно +∞ - результат равен +∞.Если x равно -∞ - результат равен +0.

15.8.2.9 floor(x)

Вернуть набольшее (ближайшее к +∞) численное значение, не большее x и являющеесяматематическим целым. Если x уже целое - вернуть x.

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.Если x равно +∞ - результат равен +∞.Если x равно -∞ - результат равен -∞.Если x больше 0, но меньше чем -1 - результат равен +0.

ЗАМЕЧАНИЕЗначение Math.floor(x) совпадает со значением -Math.ceil(-x).

15.8.2.10 log(x)

Вернуть зависящее от реализации приближение натурального логарифма x.

Если x равно NaN - результат равен NaN.Если x меньше 0 - результат равен NaN.Если x равно +0 или -0 - результат равен -∞.Если x равно 1 - результат равен +0.Если x равно +∞ - результат равен +∞.

15.8.2.11 max([ value1 [, value2 [,...]]])

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

Если аргументов не передано, результатом является -∞.

Page 179: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Если любое из значений равно NaN - результат равен NaN.Сравнение значений для определения наибольшего производится согласноописанию в разделе 11.8.5, за исключением того, что +0 считается большим, чем -0.

Значение свойства length для метода max равно 2.

15.8.2.12 min([ value1 [, value2 [,...]]])

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

Если аргументов не передано, результатом является +∞.Если любое из значений равно NaN - результат равен NaN.Сравнение значений для определения наименьшего производится согласноописанию в разделе 11.8.5, за исключением того, что +0 считается большим, чем -0.

Значение свойства length для метода min равно 2.

15.8.2.13 pow(x, y)

Вернуть зависящее от реализации приближение x, возведённого в степень y.

Если y равно NaN - результат равен NaN.Если y равно +0 - результат равен 1, даже если x равно NaN.Если y равно -0 - результат равен 1, даже если x равно NaN.Если x равно NaN, а y не равно нулю - результат равен NaN.Если abs(x)>1, а y равно +∞ - результат равен +∞ .Если abs(x)>1, а y равно -∞ - результат равен +0.Если abs(x)==1, а y равно +∞ - результат равен NaN .Если abs(x)==1, а y равно -∞ - результат равен NaN .Если abs(x)<1, а y равно +∞ - результат равен +0.Если abs(x)<1, а y равно -∞ - результат равен +∞.Если x равно +∞, а y>0 - результат равен +∞ .Если x равно +∞, а y<0 - результат равен +0 .Если x равно -∞, y>0 и y - нечётное целое, то результат равен -∞ .Если x равно -∞, y>0 и y не является нечётным целым, то результат равен +∞ .Если x равно -∞, y<0 и y - нечётное целое, то результат равен -0 .Если x равно -∞, y<0 и y не является нечётным целым, то результат равен +0 .Если x равно +0, а y>0 - результат равен +0 .Если x равно +0, а y>0 - результат равен +∞ .Если x равно -0, y>0 и y - нечётное целое, то результат равен -0 .Если x равно -0, y>0 и y не является нечётным целым, то результат равен +0 .Если x равно -0, y<0 и y - нечётное целое, то результат равен -∞.Если x равно -0, y<0 и y не является нечётным целым, то результат равен +∞ .Если x<0, x - конечное, y - конечное и y не является целым, то результат равенNaN.

15.8.2.14 random()

Возвращает положительное численное значение, большее или равное 0, но меньшее 1,

Page 180: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

15.8.2.15 round(x)

Возвращает численное значение, ближайшее к x и являющееся математическим целым.Если два целых математических значения одинаково близки к x - результатом являетсязначение, наиболее близкое к +∞. Если x - уже целое, то результат равен x.

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.Если x равно +∞ - результат равен +∞ .Если x равно -∞ - результат равен -∞.Если x больше 0, но меньше 0.5, результат равен +0.Если x меньше 0, но больше или равен -0.5 - результат равен -0.

ЗАМЕЧАНИЕ 1 Math.round(3.5) возвращает 4, но Math.round(-3.5) возвращает -3.

ЗАМЕЧАНИЕ 2 Значение Math.round(x) совпадает со значением Math.floor(x+0.5), кроме тех случаев,когда x равно -0 или меньше 0, но больше или равно -0.5. В этих случаях Math.round(x)возвращает -0, но Math.floor(x+0.5) возвращает +0.

15.8.2.16 sin(x)

Вернуть зависящее от реализации приближение синуса x. Аргумент выражен в радианах.

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.Если x равно +∞ или -∞ - результат равен NaN.

15.8.2.17 sqrt(x)

Вернуть зависящее от реализации приближение квадратного корня x.

Если x равно NaN - результат равен NaN.Если x меньше 0 - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.Если x равно +∞ - результат равен +∞ .

15.8.2.18 tan(x)

Вернуть зависящее от реализации приближение тангенса x. Аргумент выражен врадианах.

Если x равно NaN - результат равен NaN.Если x равно +0 - результат равен +0.Если x равно -0 - результат равен -0.

Page 181: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Если x равно +∞ или -∞ - результат равен NaN.

15.9 Объекты типа Date15.9.1 Общие сведения об объектах типа Date и определения внутренних операторов

Объект Date содержит число, обозначающее определённый момент времени с точностьюдо миллисекунды. Число может также равняться NaN. Это значит, что объект типа Dateне обозначает определённого момента времени.

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

15.9.1.1 Временной диапазон

Время в ECMAScript измеряется в миллисекундах с 1 января 1970 года по UTC(универсальному кодированному времени - т.е. по Гринвичу). Високосные секунды непринимаются во внимание. Предполагается, что в каждом дне ровно 86,400,000миллисекунд. Численные значения ECMAScript могут представлять все целые числа от -9007 199 254 740 991 до 9 007 199 254 740 991. Этот диапазон достаточен дляизмерения времени с миллисекундной точностью для любого момента в диапазоне 285616 лет в обе стороны относительно 1 января 1970 года.

Действительный диапазон моментов времени, разрешённый для использования вобъектах ECMAScript типа Date, немного меньше: ровно от -100 000 000 дней до +100000 000 дней относительно полночи 1 января 1970 года по UTC. Это соответствуетдиапазону в 8 640 000 000 000 000 миллисекунд в каждую сторону от 1 января 1970года по UTC.

Точный момент полночи в начале 1 января 1970 года по UTC представляется значением+0.

15.9.1.2 Номер дня и время дня

Значение времени t принадлежит дню с номером

День(t) = floor(t /мсВСутках)

где мсВСутках равно числу миллисекунд в одном дне (86400000).

Остаток называется временем дня: ВремяДня(t)= t modulo мсВСутках

15.9.1.3 Номер года

ECMAScript использует экстраполированный григорианский календарь, чтобы получитьдля номера дня номер его года и определить месяц и дату в этом году. Согласно этомукалендарю, високосными годами считаются те и только те, которые (делятся на 4) И ((НЕделятся на 100) ИЛИ (делятся на 400)). Таким образом, количество дней в году номер yопределяется выражением:

ДнейВГоду(y) = 365 если (y modulo 4) != 0 = 366 если (y modulo 4) = 0 и (y modulo 100) != 0 = 365 если (y modulo 100) = 0 и (y modulo 400) != 0 = 366 если (y modulo 400) = 0

Page 182: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Все невисокосные года содержат 365 дней и обычное количество дней в месяце. Ввисокосных годах к февралю добавляется дополнительный день. Номер дня первого днягода y вычисляется следующим образом:

ДеньДляГода(y) = 365 * (y-1970) + floor((y-1969)/4) floor((y-1901)/100) + floor((y-1601)/400)

Значение времени для начала года равно:

ВремяДляГода(y)= мсВСутках × ДеньДляГода(y)

Номер года для значения времени находится следующим образом:

ГодДляВремени(t) = наибольшее целое y (ближайшее к положительной бесконечности)такое, что ВремяДляГода(y) ≤ t

Функция високосного года даёт 1 для времени, принадлежащего високосному году, и 0для остальных моментов времени:

ВВисокосномГоду(t) = 0 если ДнейВГоду(ГодДляВремени(t)) = 365 = 1 если ДнейВГоду(ГодДляВремени(t)) = 366

15.9.1.4 Номер месяца

Месяцы определяются целым числом в диапазоне от 0 до 11 включительно.Отображение МесяцДляВремени(t) значения времени t в номер месяца определяетсяследующим образом:

МесяцДляВремени(t) = 0 если 0 <= ДеньГода(t)< 31 = 1 если 31 <= ДеньГода(t) < 59+ВВисокосномГоду(t) = 2 если 59+ВВисокосномГоду(t) <= ДеньГода(t) < 90+ВВисокосномГоду(t) = 3 если 90+ВВисокосномГоду(t) <= ДеньГода(t) < 120+ВВисокосномГоду(t) = 4 если 120+ВВисокосномГоду(t) <= ДеньГода(t) < 151+ВВисокосномГоду(t) = 5 если 151+ВВисокосномГоду(t) <= ДеньГода(t) < 181+ВВисокосномГоду(t) = 6 если 181+ВВисокосномГоду(t) <= ДеньГода(t) < 212+ВВисокосномГоду(t) = 7 если 212+ВВисокосномГоду(t) <= ДеньГода(t) < 243+ВВисокосномГоду(t) = 8 если 243+ВВисокосномГоду(t) <= ДеньГода(t) < 273+ВВисокосномГоду(t) = 9 если 273+ВВисокосномГоду(t) <= ДеньГода(t) < 304+ВВисокосномГоду(t) = 10 если 304+ВВисокосномГоду(t) <= ДеньГода(t) < 334+ВВисокосномГоду(t) = 11 если 334+ВВисокосномГоду(t) <= ДеньГода(t) < 365+ВВисокосномГоду(t)

где

ДеньГода(t)= День(t)-ДеньДляГода(ГодДляВремени(t))

Значение месяца, равное 0, обозначает январь; 1 - февраль; 2 - март; 3 - апрель; 4 -май; 5 - июнь; 6 - июль; 7 - август; 8 - сентябрь; 9 - октябрь; 10 - ноябрь; 11 - декабрь.Заметим, что значение МесяцДляВремени(0) равно 0, соответствуя четвергу 1 января1970 года.

15.9.1.5 Номер дня

Номер дня определяется целым в диапазоне от 1 до 31 включительно. ОтображениеДатаДляВремени(t) значения времени t в номер дня определяется следующим образом:

ДатаДляВремени(t) = ДеньГода(t)+ 1 если МесяцДляВремени(t)= 0 = ДатаДляВремени(t)-30 если МесяцДляВремени(t)= 1 = ДатаДляВремени(t)-58-ВВисокосномГоду(t) если МесяцДляВремени(t)= 2 = ДатаДляВремени(t)-89-ВВисокосномГоду(t) если МесяцДляВремени(t)= 3

Page 183: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

= ДатаДляВремени(t)-119-ВВисокосномГоду(t) если МесяцДляВремени(t)= 4 = ДатаДляВремени(t)-150-ВВисокосномГоду(t) если МесяцДляВремени(t)= 5 = ДатаДляВремени(t)-180-ВВисокосномГоду(t) если МесяцДляВремени(t)= 6 = ДатаДляВремени(t)-211-ВВисокосномГоду(t) если МесяцДляВремени(t)= 7 = ДатаДляВремени(t)-242-ВВисокосномГоду(t) если МесяцДляВремени(t)= 8 = ДатаДляВремени(t)-272-ВВисокосномГоду(t) если МесяцДляВремени(t)= 9 = ДатаДляВремени(t)-303-ВВисокосномГоду(t) если МесяцДляВремени(t)= 10 = ДатаДляВремени(t)-333-ВВисокосномГоду(t) если МесяцДляВремени(t)= 11

15.9.1.6 День недели

День недели для определённого значения t определяется как

ДеньНедели(t)=( День(t) + 4) modulo 7

Значение месяца, равное 0, обозначает воскресенье; 1 - понедельник; 2 - вторник; 3 -среда; 4 - четверг; 5 - пятница; 6 - суббота. Заметим, что значение ДеньНедели(0) равно4, соответствуя четвергу 1 января 1970 года.

15.9.1.8 Поправка на местное время

Ожидается, что реализация ECMAScript будет определять поправку на местное время.Поправка на местное время - значение LocalTZA, измеряемое в миллисекундах, которое,будучи прибавленным к UTC, представляет стандартное (зимнее) местное время. Летнеевремя не отражается в LocalTZA. Значение LocalTZA не изменяется со временем, нозависит только от географического местоположения.

15.9.1.9 Переход на летнее время

Ожидается, что реализация ECMAScript будет определять поправку на летнее время.Алгоритм определения поправки на летнее время ПопрЛетнееВремя(t), измеряемой вмиллисекундах, должен зависеть только от четырёх вещей:

(1) время с начала года

t - ВремяДляГода(ГодДляВремени(t))

(2) относится ли t к високосному году

ВВисокосномГоду(t)

(3) день недели начала текущего года

ДеньНедели(ВремяДляГода(ГодДляВремени(t)) и

(4) географическое положение

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

Если среда системы предоставляет функциональность по определению летнего времени,реализация ECMAScript может использовать вместо интересующего её годаэквивалентный ему год (та же високосность и тот же начальный день недели), длякоторого среда может предоставить информацию по летнему времени. Единственным

Page 184: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

15.9.1.9b Местное время

Преобразование из UTC в местное время определяется следующим образом:

МестноеВремя(t)= t + LocalTZA + ПопрЛетнееВремя(t)

Преобразование из местного времени в UTC определяется следующим образом:

UTC(t) = t - LocalTZA - ПопрЛетнееВремя(t - LocalTZA)

Заметим, что UTC(МестноеВремя(t)) не всегда равняется t.

15.9.1.10 Часы, минуты, секунды и миллисекунды

Следующие функции полезны для разбора значений времени:

ЧасДляВремени(t) = floor(t / мсВЧасе) modulo ЧасовВСутках

МинутаДляВремени(t) = floor(t / мсВМинуте) modulo МинутВЧасе

СекундаДляВремени(t) = floor(t / мсВСекунде) modulo СекундВМинуте

мсДляВремени(t)= t modulo мсВСекунде

где ЧасовВСутках = 24

МинутВЧасе = 60

СекундВМинуте = 60

мсВСекунде = 1000

мсВМинуте = мсВСекунде * СекундВМинуте = 60000

мсВЧасе = мсВМинуте * МинутВЧасе = 3600000

15.9.1.11 СоставитьВремя(hour, min, sec, ms)

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

1. Если hour не конечно, или min не конечно, или sec не конечно, или ms не конечно -вернуть NaN.

2. Вызвать ToInteger(hour).

3. Вызвать ToInteger(min).

4. Вызвать ToInteger(sec).

5. Вызвать ToInteger(ms).

Page 185: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Вычислить Результат(2) * мсВЧасе + Результат(3) * мсВМинуте + Результат(4) *мсВСекунде + Результат(5), выполняя арифметические действия согласно правилам IEEE754 (т. е. аналогично использованию операторов ECMAScript * и +).

7. Вернуть Результат(6).

15.9.1.12 СоставитьДень(year, month, date)

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

1. Если year не конечно, или month не конечно, или date не конечно - вернуть NaN.

2. Вызвать ToInteger(year).

3. Вызвать ToInteger(month).

4. Вызвать ToInteger(date).

5. Вычислить Результат(2) + floor(Результат(3)/ 12).

6. Вычислить Результат(3) modulo 12.

7. Найти значение t такое, что ГодДляВремени(t) == Результат(5), МесяцДляВремени(t) ==Результат(6), а ДатаДляВремени(t) == 1; но если это невозможно (потому что какой-либоаргумент находится вне допустимого диапазона), вернуть NaN.

8. Вычислить День(Результат(7)) + Результат(4)-1.

9. Вернуть Результат(8).

15.9.1.13 СоставитьДату(day, time)

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

1. Если day не конечно или time не конечно - вернуть NaN.

2. Вычислить day * мсВСутках + time.

3. Вернуть Результат(2).

15.9.1.14 ОграничитьВремя(time)

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

1. Если time не конечно - вернуть NaN.

2. Если abs(Результат(1)) > 8.64 x 1015 - вернуть NaN.

Page 186: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Вернуть, по выбору реализации, либо ToInteger( Результат(2)), либоToInteger(Результат(2)) + (+ 0). (Добавление положительного нуля преобразует -0 в +0.)

ЗАМЕЧАНИЕСмысл шага 3 в том, что реализации предоставляется свобода в выборе внутреннегопредставления величин времени. Например, может использоваться 64-битное знаковоецелое или 64-битное число с плавающей точкой. В зависимости от реализации этовнутреннее представление может различать или не различать -0 и +0.

15.9.2 Вызов конструктора Date как функции

Когда Date вызывается не как конструктор, а как функция, он возвращает строку,представляющую текущее время (UTC).

ЗАМЕЧАНИЕВызов функции Date(...) не эквивалентен выражению создания объекта new Date(...) стем же аргументом.

15.9.2.1 Date([ year [, month[, date[, hours [, minutes[, seconds[, ms]]]]]]])

Все аргументы являются опциональными. Все переданные аргументы принимаются, нополностью игнорируются. Создаётся и возвращается строка, как бы она была возвращенавыражением (new Date()).toString().

15.9.3 Конструктор Date

Когда Date вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.9.3.1 new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])

Когда конструктор Date вызывается с аргументами в количестве от 2 до 7, он вычисляетдату на основе аргументов year, month и (опционально) date, hours, minutes, seconds иms.

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Date, т.е. тому, который представляет собой первоначальноезначение Date.prototype (см. раздел 15.9.4.1).

Свойство [[Class]] создаваемого объекта устанавливается в "Date".

Свойство [[Value]] создаваемого объекта устанавливается следующим образом:

1. Вызвать ToNumber(year).

2. Вызвать ToNumber(month).

3. Если передан date, использовать ToNumber(date), иначе использовать 1.

4. Если передан hours, использовать ToNumber(hours), иначе использовать 0.

5. Если передан minutes, использовать ToNumber(minutes), иначе использовать 0.

6. Если передан seconds, использовать ToNumber(seconds), иначе использовать 0.

Page 187: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

7. Если передан ms, использовать ToNumber(ms), иначе использовать 0.

8. Если Результат(1) не равен NaN и 0 <= ToInteger(Результат(1)) < 99, Результат(8) равен1900 + ToInteger(Результат(1)). Иначе Результат(8) равен Результату(1).

9. Вычислить СоставитьДень(Результат(8), Результат(2), Результат(3)).

10. Вычислить СоставитьВремя(Результат(4), Результат(5), Результат(6), Результат(7)).

11. Вычислить СоставитьДату(Результат(9), Результат(10)).

12. Установить значение свойства [[Value]] создаваемого объекта равнымОграничитьВремя(UTC(Результат(11))).

15.9.3.2 new Date(value)

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Date, т.е. тому, который представляет собой первоначальноезначение Date.prototype (см. раздел 15.9.4.1).

Свойство [[Class]] создаваемого объекта устанавливается в "Date".

Свойство [[Value]] создаваемого объекта устанавливается следующим образом:

1. Вызвать ToPrimitive(value).

2. Если Тип(Результат(1)) равен String - переход на шаг 5.

3. Пусть V равно ToNumber(Результат(1)).

4. Установить значение свойства [[Value]] создаваемого объекта равнымОграничитьВремя(V) и вернуть управление.

5. Разобрать Результат(1) как дату, точно таким же образом, как в методе parse (см.раздел 15.9.4.2). Пусть V - значение времени для этой даты.

6. Переход на шаг 4.

15.9.3.3 new Date()

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Date, т.е. тому, который представляет собой первоначальноезначение Date.prototype (см. раздел 15.9.4.1).

Свойство [[Class]] создаваемого объекта устанавливается в "Date".

Значение свойства [[Value]] создаваемого объекта устанавливается равным текущемувремени (по UTC).

15.9.4 Свойства конструктора Object

Значением внутреннего свойства [[Prototype]] конструктора Date является объект-прототип Function (см. раздел 15.3.4).

Page 188: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Кроме внутренних свойств и свойства length (значение которого равно 7), конструкторDate обладает следующими свойствами:

15.9.4.1 Date.prototype

Начальным значением Date.prototype является встроенный объект-прототип Date (см.раздел 15.9.5).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.9.4.2 Date.parse(string)

Функция parse применяет к своему аргументу оператор ToString и интерпретируетрезультирующую строку как дату. Она возвращает число - значение времени по UTC,соответствующее этой дате. Строка может быть интерпретирована как местное время,время по UTC или время в какой-либо другой временной зоне, в зависимости отсодержимого строки.

Если x - любой объект Date, значение миллисекунд в котором равняется нулю в даннойреализации ECMAScript, то все нижеперечисленные выражения должны возвращать вданной реализации одно и то же численное значение, если все используемые в нихсвойства имеют первоначальные значения:

x. valueOf()

Date.parse(x. toString())

Date.parse(x.toUTCString())

Однако выражение

Date.parse(x. toLocaleString())

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

15.9.4.3 Date.UTC(year, month[, date[, hours [, minutes[, seconds[, ms]]]]])

Когда функция UTC вызывается с менее чем двумя аргументами, её поведение зависит отреализации. Когда функция UTC вызывается с аргументами в количестве от 2 до 7, онавычисляет дату на основе аргументов year, month и (опционально) date, hours, minutes,seconds и ms. Предпринимаются следующие шаги:

1. Вызвать ToNumber(year).

2. Вызвать ToNumber(month).

3. Если передан date, использовать ToNumber(date), иначе использовать 1.

4. Если передан hours, использовать ToNumber(hours), иначе использовать 0.

5. Если передан minutes, использовать ToNumber(minutes), иначе использовать 0.

Page 189: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Если передан seconds, использовать ToNumber(seconds), иначе использовать 0.

7. Если передан ms, использовать ToNumber(ms), иначе использовать 0.

8. Если Результат(1) не равен NaN и 0 <= ToInteger(Результат(1)) < 99, Результат(8) равен1900 + ToInteger(Результат(1)). Иначе Результат(8) равен Результату(1).

9. Вычислить СоставитьДень(Результат(8), Результат(2), Результат(3)).

10. Вычислить СоставитьВремя(Результат(4), Результат(5), Результат(6), Результат(7)).

11. Вернуть СоставитьДату(Результат(9), Результат(10)).

Свойство length функции UTC имеет значение 7.

ЗАМЕЧАНИЕФункция UTC отличается от конструктора Date в двух деталях: она возвращает значениевремени как число вместо создания объекта Date, и она интерпретирует аргументы вUTC, а не по местному времени.

15.9.5 Свойства объекта-прототипа Date

Объектом-прототипом Date является также объект Date (его [[Class]] равен "Date"),значением которого является NaN.

Значением внутреннего свойства [[Prototype]] объекта-прототипа Date является объект-прототип Object (15.2.3.1).

В последующих описаниях функций, являющихся свойствами объекта-прототипа Date,словосочетание "данный объект Date" относится к значению this, переданному привызове этой функции. Все эти функции являются привязанными к типу: если значениеthis не является объектом, для которого значением внутреннего свойства [[Class]]является "Date", бросается исключение TypeError. Фраза "данное значение времени"относится к численному значению, представляемому данным объектом типа Date, т.е. кзначению внутреннего свойства [[Value]] данного объекта типа Date.

15.9.5.1 Date.prototype.constructor

Начальным значением Date.prototype.constructor является встроенный конструктор Date.

15.9.5.2 Date.prototype.toString()

Эта функция возвращает строковое значение. Содержимое строки зависит отреализации, но должно представлять значение объекта типа Date по местному времени вудобной для человеческого восприятия форме.

ЗАМЕЧАНИЕ Предполагается, что для любого значения типа Date d, результат выполненияDate.prototype.parse(d.toString()) (см. раздел 15.9.4.2) равен d.

15.9.5.3 Date.prototype.toDateString()

Эта функция возвращает строковое значение. Содержимое строки зависит от

Page 190: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

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

15.9.5.4 Date.prototype.toTimeString()

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

15.9.5.5 Date.prototype.toLocaleString()

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

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

15.9.5.6 Date.prototype.toLocaleDateString()

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

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

15.9.5.7 Date.prototype.toLocaleTimeString()

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

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

15.9.5.8 Date.prototype.valueOf()

Метод valueOf возвращает число, равное данному значению времени.

15.9.5.9 Date.prototype.getTime()

1. Если значение this не является объектом, свойство [[Class]] которого равно "Date" -бросить исключение TypeError.

Page 191: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Вернуть данное значение времени.

15.9.5.10 Date.prototype.getFullYear()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ГодДляВремени(МестноеВремя(t)).

15.9.5.11 Date.prototype.getUTCFullYear()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ГодДляВремени(t).

15.9.5.12 Date.prototype.getMonth()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть МесяцДляВремени(МестноеВремя(t)).

15.9.5.13 Date.prototype.getUTCMonth()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть МесяцДляВремени(t).

15.9.5.14 Date.prototype.getDate()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ДатаДляВремени(МестноеВремя(t)).

15.9.5.15 Date.prototype.getUTCDate()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ДатуДляВремени(t).

15.9.5.16 Date.prototype.getDay()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

Page 192: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Return ДеньНедели(МестноеВремя(t)).

15.9.5.17 Date.prototype.getUTCDay()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ДеньНедели(t).

15.9.5.18 Date.prototype.getHours()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ЧасДляВремени(МестноеВремя(t)).

15.9.5.19 Date.prototype.getUTCHours()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ЧасДляВремени(t).

15.9.5.20 Date.prototype.getMinutes()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть МинутуДляВремени(МестноеВремя(t)).

15.9.5.21 Date.prototype.getUTCMinutes()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть МинутуДляВремени(t).

15.9.5.22 Date.prototype.getSeconds()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть СекундуДляВремени(МестноеВремя(t)).

15.9.5.23 Date.prototype.getUTCSeconds()

1. Пусть t - данное значение времени.

Page 193: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Если t равно NaN - вернуть NaN.

3. Вернуть СекундуДляВремени(t).

15.9.5.24 Date.prototype.getMilliseconds()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть мсДляВремени(МестноеВремя(t)).

15.9.5.25 Date.prototype.getUTCMilliseconds()

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть мсДляВремени(t).

15.9.5.26 Date.prototype.getTimezoneOffset()

Вернуть разницу между местным временем и временем по UTC в минутах.

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть (t - МестноеВремя(t)) / мсВМинуте.

15.9.5.27 Date.prototype.setTime(time)

1. Если this - не объект типа Date, бросить исключение TypeError.

2. Вызвать ToNumber(time).

3. Вызвать ОграничитьВремя(Результат(1)).

4. Установить свойство [[Value]] значения this равным Результату(2).

5. Вернуть значение свойства [[Value]] значения this.

15.9.5.28 Date.prototype.setMilliseconds(ms)

1. Пусть t - результат выражения МестноеВремя(данное значение времени).

2. Вызвать ToNumber(ms).

3. Вычислить СоставитьВремя(ЧасДляВремени(t), МинутаДляВремени(t),СекундаДляВремени(t), Результат(2)).

4. Вычислить UTC(СоставитьДату(День(t), Результат(3))).

5. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(4)).

Page 194: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Вернуть значение свойства [[Value]] значения this.

15.9.5.29 Date.prototype.setUTCMilliseconds(ms)

1. Пусть t - данное значение времени.

2. Вызвать ToNumber(ms).

3. Вычислить СоставитьВремя(ЧасДляВремени(t), МинутаДляВремени(t),СекундаДляВремени(t), Результат(2)).

4. Вычислить СоставитьДату(День(t), Результат(3)).

5. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(4)).

6. Вернуть значение свойства [[Value]] значения this.

15.9.5.30 Date.prototype.setSeconds(sec [, ms ] )

Если ms не указано, этот метод ведёт себя, как будто в качестве ms было указанозначение getMilliseconds().

1. Пусть t - результат выражения МестноеВремя(данное значение времени).

2. Вызвать ToNumber(sec).

3. Если ms не указано - вычислить мсДляВремени(t). Иначе вызвать ToNumber(ms).

4. Вычислить СоставитьВремя(ЧасДляВремени(t), МинутаДляВремени(t), Результат(2),Результат(3)).

5. Вычислить UTC(СоставитьДату(День(t), Результат(4))).

6. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(5)).

7. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setSeconds имеет значение 2.

15.9.5.31 Date.prototype.setUTCSeconds(sec [, ms ] )

Если ms не указано, этот метод ведёт себя, как будто в качестве ms было указанозначение getUTCMilliseconds().

1. Пусть t - данное значение времени.

2. Вызвать ToNumber(sec).

3. Если ms не указано - вычислить мсДляВремени(t). Иначе вызвать ToNumber(ms).

4. Вычислить СоставитьВремя(ЧасДляВремени(t), МинутаДляВремени(t), Результат(2),Результат(3)).

5. Вычислить СоставитьДату(День(t), Результат(4)).

Page 195: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

6. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(5)).

7. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setUTCSeconds имеет значение 2.

15.9.5.33 Date.prototype.setMinutes(min [, sec [, ms ] ] )

Если sec не указано, этот метод ведёт себя, как будто в качестве sec было указанозначение getSeconds().

Если ms не указано, этот метод ведёт себя, как будто в качестве ms было указанозначение getMilliseconds().

1. Пусть t - результат выражения МестноеВремя(данное значение времени).

2. Вызвать ToNumber(min).

3. Если sec не указано - вычислить СекундуДляВремени(t). Иначе вызвать ToNumber(sec).

4. Если ms не указано - вычислить мсДляВремени(t). Иначе вызвать ToNumber(ms).

5. Вычислить СоставитьВремя(ЧасДляВремени(t), Результат(2), Результат(3), Результат(4)).

6. Вычислить UTC(СоставитьДату(День(t), Результат(5))).

7. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(6)).

8. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setMinutes имеет значение 3.

15.9.5.34 Date.prototype.setUTCMinutes(min [, sec [, ms ] ] )

Если sec не указано, этот метод ведёт себя, как будто в качестве sec было указанозначение getUTCSeconds().

Если ms не указано, этот метод ведёт себя, как будто в качестве ms было указанозначение getUTCMilliseconds().

1. Пусть t - данное значение времени.

2. Вызвать ToNumber(min).

3. Если sec не указано - вычислить СекундуДляВремени(t). Иначе вызвать ToNumber(sec).

4. Если ms не указано - вычислить мсДляВремени(t). Иначе вызвать ToNumber(ms).

5. Вычислить СоставитьВремя(ЧасДляВремени(t), Результат(2), Результат(3), Результат(4)).

6. Вычислить СоставитьДату(День(t), Результат(5)).

7. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(6)).

8. Вернуть значение свойства [[Value]] значения this.

Page 196: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Свойство length метода setUTCMinutes имеет значение 3.

15.9.5.35 Date.prototype.setHours(hour[, min [, sec[, ms]]])

Если min не указано, этот метод ведёт себя, как будто в качестве min было указанозначение getMinutes().

Если sec не указано, этот метод ведёт себя, как будто в качестве sec было указанозначение getSeconds(). Если ms не указано, этот метод ведёт себя, как будто в качествеms было указано значение getMilliseconds().

1. Пусть t - результат выражения МестноеВремя(данное значение времени).

2. Вызвать ToNumber(hour).

3. Если min не указано - вычислить МинутуДляВремени(t). Иначе вызвать ToNumber(min).

4. Если sec не указано - вычислить СекундуДляВремени(t). Иначе вызвать ToNumber(sec).

5. Если ms не указано - вычислить мсДляВремени(t). Иначе вызвать ToNumber(ms).

6. Вычислить СоставитьВремя(Результат(2), Результат(3), Результат(4), Результат(5)).

7. Вычислить UTC(СоставитьДату(День(t), Результат(6))).

8. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(7)).

9. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setHours имеет значение 4.

15.9.5.36 Date.prototype.setUTCHours(hour [, min[, sec [, ms ]]])

Если min не указано, этот метод ведёт себя, как будто в качестве min было указанозначение getUTCMinutes().

Если sec не указано, этот метод ведёт себя, как будто в качестве sec было указанозначение getUTCSeconds(). Если ms не указано, этот метод ведёт себя, как будто вкачестве ms было указано значение getUTCMilliseconds().

1. Пусть t - данное значение времени.

2. Вызвать ToNumber(hour).

3. Если min не указано - вычислить МинутуДляВремени(t). Иначе вызвать ToNumber(min).

4. Если sec не указано - вычислить СекундуДляВремени(t). Иначе вызвать ToNumber(sec).

5. Если ms не указано - вычислить мсДляВремени(t). Иначе вызвать ToNumber(ms).

6. Вычислить СоставитьВремя(Результат(2), Результат(3), Результат(4), Результат(5)).

7. Вычислить СоставитьДату(День(t), Результат(6)).

Page 197: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

8. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(7)).

9. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setUTCHours имеет значение 4.

15.9.5.36 Date.prototype.setDate(date)

1. Пусть t - результат выражения МестноеВремя(данное значение времени).

2. Вызвать ToNumber(date).

3. Вычислить СоставитьДень(ГодДляВремени(t), МесяцДляВремени(t), Результат(2)).

4. Вычислить UTC(СоставитьДату(Результат(3), ВремяДня(t))).

5. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(4)).

6. Вернуть значение свойства [[Value]] значения this.

15.9.5.37 Date.prototype.setUTCDate(date)

1. Пусть t - данное значение времени.

2. Вызвать ToNumber(date).

3. Вычислить СоставитьДень(ГодДляВремени(t), МесяцДляВремени(t), Результат(2)).

4. Вычислить СоставитьДату(Результат(3), ВремяДня(t)).

5. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(4)).

6. Вернуть значение свойства [[Value]] значения this.

15.9.5.38 Date.prototype.setMonth(month [, date ] )

Если date не указано, этот метод ведёт себя, как будто в качестве date было указанозначение getDate().

1. Пусть t - результат выражения МестноеВремя(данное значение времени).

2. Вызвать ToNumber(month).

3. Если date не указано - вычислить ДатуДляВремени(t). Иначе вызвать ToNumber(date).

4. Вычислить СоставитьДень(ГодДляВремени(t), Результат(2), Результат(3)).

5. Вычислить UTC(СоставитьДату(Результат(4), ВремяДня(t))).

6. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(5)).

7. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setMonth имеет значение 2.

Page 198: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.9.5.39 Date.prototype.setUTCMonth(month [, date ] )

Если date не указано, этот метод ведёт себя, как будто в качестве date было указанозначение getUTCDate().

1. Пусть t - данное значение времени.

2. Вызвать ToNumber(month).

3. Если date не указано - вычислить ДатуДляВремени(t). Иначе вызвать ToNumber(date).

4. Вычислить СоставитьДень(ГодДляВремени(t), Результат(2), Результат(3)).

5. Вычислить СоставитьДату(Результат(4), ВремяДня(t)).

6. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(5)).

7. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setUTCMonth имеет значение 2.

15.9.5.40 Date.prototype.setFullYear(year [, month [, date ] ] )

Если month не указано, этот метод ведёт себя, как будто в качестве month было указанозначение getMonth().

Если date не указано, этот метод ведёт себя, как будто в качестве date было указанозначение getDate().

1. Пусть t - результат выражения МестноеВремя(данное значение времени). Но еслиданное значение времени равно NaN, взять в качестве t +0.

2. Вызвать ToNumber(year).

3. Если month не указано - вычислить МесяцДляВремени(t). Иначе вызватьToNumber(month).

4. Если date не указано - вычислить ДатуДляВремени(t). Иначе вызвать ToNumber(date).

5. Вычислить СоставитьДень(Результат(2), Результат(3), Результат(4)).

6. Вычислить UTC(СоставитьДату(Результат(5), ВремяДня(t))).

7. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(6)).

8. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setFullYear имеет значение 3.

15.9.5.41 Date.prototype.setUTCFullYear(year [, month [, date ] ] )

Если month не указано, этот метод ведёт себя, как будто в качестве month было указанозначение getUTCMonth().

Если date не указано, этот метод ведёт себя, как будто в качестве date было указано

Page 199: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

значение getUTCDate().

1. Пусть t - данное значение времени. Но если данное значение времени равно NaN,взять в качестве t +0.

2. Вызвать ToNumber(year).

3. Если month не указано - вычислить МесяцДляВремени(t). Иначе вызватьToNumber(month).

4. Если date не указано - вычислить ДатуДляВремени(t). Иначе вызвать ToNumber(date).

5. Вычислить СоставитьДень(Результат(2), Результат(3), Результат(4)).

6. Вычислить СоставитьДату(Результат(5), ВремяДня(t)).

7. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(6)).

8. Вернуть значение свойства [[Value]] значения this.

Свойство length метода setUTCFullYear имеет значение 3.

15.9.5.42 Date.prototype.toUTCString()

Эта функция возвращает строковое значение. Содержимое строки зависит отреализации, но должно представлять значение объекта типа Date по UTC в удобной длячеловеческого восприятия форме.

15.9.6 Свойства экземпляров Date

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

15.10 Объекты типа RegExp (регулярные выражения)

Объект RegExp содержит регулярное выражение и связанные с ним флаги.

ЗАМЕЧАНИЕВид и функциональность регулярных выражений реализованы по подобию подсистемырегулярных выражений в языке программирования Perl 5.

15.10.1 Шаблоны

Конструктор RegExp применяет к входной строке-шаблону следующую грамматику. Еслиграмматика не может расшифровать строку как нетерминал Шаблон, выдаётся ошибка.

Синтаксис

Шаблон ::Дизъюнкция

Дизъюнкция ::Альтернатива Альтернатива | Дизъюнкция

Page 200: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Альтернатива ::[пусто] Альтернатива Элемент

Элемент ::Проверка Атом Атом ПризнакКоличества

Проверка ::^ $ \b \B

ПризнакКоличества ::ПрефиксПризнакаКоличества ПрефиксПризнакаКоличества ?

ПрефиксПризнакаКоличества ::* + ? { ДесятичныеЦифры } { ДесятичныеЦифры ,} { ДесятичныеЦифры , ДесятичныеЦифры }

Атом ::СимволШаблона . \ EscapeАтом КлассСимволов ( Дизъюнкция ) (?: Дизъюнкция ) (?= Дизъюнкция ) (?! Дизъюнкция )

СимволШаблона ::ИсходныйСимвол но не один из: ^ $ \ . * + ? ( ) [ ] { } |

ДесятичнаяEscapeАтом ::ДесятичнаяEscapeСимвольнаяEscapeEscapeКлассаСимвола

СимвольнаяEscape ::УправляющаяEscape c УправляющийСимвол ШестнадцатеричнаяEscapeПоследовательность ЮникоднаяEscapeПоследовательность EscapeИдентификатора

Page 201: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

УправляющаяEscape :: один изf n r t v

УправляющийСимвол :: один изa b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

EscapeИдентификатора ::ИсходныйСимвол но не ЧастьИдентификатора

ДесятичнаяEscape ::ДесятичныйЦелыйЛитерал [предпросмотр ДесятичнаяЦифра]

EscapeКлассаСимвола :: один изd D s S w W

КлассСимволов ::[ [предпросмотр {^}] ДиапазоныКласса ] [^ ДиапазоныКласса ]

ДиапазоныКласса ::[пусто] НепустыеДиапазоныКласса

НепустыеДиапазоныКласса ::АтомКласса АтомКласса НепустыеДиапазоныКлассаБезТире АтомКласса - АтомКласса ДиапазоныКласса

НепустыеДиапазоныКлассаБезТире ::АтомКласса АтомКлассаБезТире НепустыеДиапазоныКлассаБезТире АтомКлассаБезТире - АтомКласса ДиапазоныКласса

АтомКласса ::-АтомКлассаБезТире

АтомКлассаБезТире ::ИсходныйСимвол но не один из \ ] - \ EscapeКласса

EscapeКласса ::ДесятичнаяEscape b СимвольнаяEscape EscapeКлассаСимвола

15.10.2 Семантика шаблонов

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

Page 202: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.10.2.1 Обозначения

Описания ниже используют следующие переменные:

Input - строка, в которой ищутся соответствия для шаблона регулярного выражения.Запись input[n] обозначает n-ый символ input, где n может быть в диапазоне от 0(включительно) до InputLength (не включительно).InputLength - количество символов в строке Input.NCapturingParens - общее количество захватывающих скобок (т. е. общееколичество раз, когда для разбора регулярного выражения применяетсяграмматическое правило Атом :: ( Дизъюнкция )) в шаблоне. Левая захватывающаяскобка - любой символ шаблона (, который используется как терминал ( в правилеАтом :: ( Дизъюнкция ).IgnoreCase - значение свойства ignoreCase ("нечувствительность к регистру") объектатипа RegExp.Multiline - значение свойства multiline ("многострочность") объекта типа RegExp.

Кроме того, нижеприведённые описания используют следующие внутренние структурыданных:

НаборСимволов - математический набор символов.Состояние - упорядоченная пара (endIndex, captures), где endIndex - целое integer,а captures - внутренний массив из NCapturingParens значений. Состоянияиспользуются для представления промежуточных состояний в процессе нахождениясоответствия регулярному выражению. Значение endIndex равно увеличенному наединицу индексу последнего входного символа, соответствующего регулярномувыражению, а в captures хранятся результаты захвата группирующими скобками. n-й элемент массива captures содержит либо строку, представляющую значение,полученное n-й парой захватывающих скобок, либо undefined, если n-я паразахватывающих скобок ещё не была достигнута. Поскольку используется перебор свозвратом, в любой момент процесса поиска соответствий могут одновременноиспользоваться несколько состояний.Структура MatchResult представляет собой либо Состояние, либо специальноезначение failure, которое означает, что поиск соответствия не удался.Функция Продолжение представляет собой внутреннее замыкание (т. е. внутреннююфункцию, некоторые аргументы которой уже привязаны к значениям), котороеполучает на вход один аргумент типа State и возвращает результат типаMatchResult. Если внутреннее замыкание ссылается на переменные, привязанные кфункции, создавшей это замыкание, то замыкание использует значения, которымиэти переменные обладали в момент создания замыкания. Продолжение пытаетсянайти соответствия для оставшейся части шаблона (определённой ужепривязанными аргументами замыкания) во входной строке, начиная спромежуточного состояния, определённого его аргументом State. Если соответствиенаходится успешно, продолжение возвращает последнее состояние State, которогооно достигло. Если соответствия не находится, продолжение возвращает failure.Функция Сличитель является внутренним замыканием, принимающим два аргумента(Состояние и Продолжение) и возвращающим результат типа MatchResult. Сличительпытается найти соответствие для средней части шаблона (определённой ужепривязанными аргументами замыкания) во входной строке, начиная спромежуточного состояния, определённого его аргументом Состояние. АргументПродолжение должен равняться замыканию, которое ищет соответствие для

Page 203: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

оставшейся части шаблона. После поиска соответствия для подшаблона шаблона иполучения нового Состояния, искатель вызывает Продолжение для этого состояния,чтобы проверить, находится ли соответствие для оставшейся части шаблона. Еслионо находится, сличитель возвращает состояние, возвращённое продолжением. Впротивном случае сличитель может попробовать другие варианты в своих точкахветвления, последовательно вызывая Продолжение, пока либо оно вернётположительный результат, либо все возможности будут исчерпаны.Функция ПроверщикУсловия является внутренним замыканием, принимающимаргумент Состояние и возвращающим булевский результат. Проверщик условияпроверяет выполнение некоторого условия (определённого уже привязаннымиаргументами замыкания) в некотором месте входной строки и возвращает true,если условие выполнено, или false, если оно не выполнено.EscapeЗначение является либо символом, либо целым. EscapeЗначение используетсядля описания способа трактовки ДесятичнойEscape escape-последовательности:символ ch обозначает, что escape-последовательность трактуется как символ ch, ацелое n обозначает, что escape-последовательность трактуется как обратная ссылкана n-ю пару захватывающих скобок.

15.10.2.2 Шаблон

Значение нетерминала Шаблон :: Дизъюнкция вычисляется по следующей схеме:

1. Вычислить значение Дизъюнкции, получив Сличитель m.

2. Вернуть внутреннее замыкание, принимающее два аргумента: строку str и целоеindex, и произвести следующее:

1. Пусть Input - данная строка str. Эта переменная будет использована в функцияхраздела 15.10.2.

2. Пусть InputLength - длина Input. Эта переменная будет использована в функцияхраздела 15.10.2.

3. Пусть c - Продолжение, которое всегда возвращает свой аргумент Состояние какуспешный MatchResult.

4. Пусть cap - внутренний массив из NCapturingParens значений undefined,пронумерованных от 1 до NCapturingParens.

5. Пусть x - Состояние (index, cap).

6. Вызвать m(x, c) и вернуть его результат.

Поясняющие комментарии: Результатом вычисления значения ("компиляции") Шаблонаявляется внутренняя функция. После этого RegExp.prototype.exec может применять этуфункцию, передав ей строку и смещение в ней, чтобы определить, находится ли дляшаблона соответствие именно в этом месте строки, и, если находится, какими будутзначения захватывающих скобок. Алгоритмы раздела 15.10.2 спроектированы так, чтокомпиляция шаблона может бросить исключение SyntaxError. С другой стороны, кактолько шаблон был успешно скомпилирован, применение результирующей функции длянахождения соответствия в строке не может бросить исключения (кроме некоторыхисключений среды, которые могут возникнуть в любом месте - например, нехватка

Page 204: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

памяти).

15.10.2.3 Дизъюнкция

Значение нетерминала Дизъюнкция :: Альтернатива вычисляется путём вычислениязначения Альтернативы, которое даёт Искатель, и возврата этого Искателя.

Значение нетерминала Дизъюнкция :: Альтернатива | Дизъюнкция вычисляется последующей схеме:

1. Вычислить значение Альтернативы, получив Сличитель m1.

2. Вычислить значение Дизъюнкции, получив Сличитель m2.

3. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Вызвать m1(x, c), получив результат r.

2. Если r не равно failure, вернуть r.

3. Вызвать m2(x, c) и вернуть результат вызова.

Поясняющие комментарии: Оператор регулярного выражения | разделяет двеальтернативы. Шаблон сначала пытается найти соответствие для левой Альтернативы (закоторой следует остаток регулярного выражения). Если соответствия найти не удаётся,он пытается найти соответствие для правой Дизъюнкции (за которой следует остатокрегулярного выражения). Если и левая Альтернатива, и правая Дизъюнкция, и остатокобладают точками ветвления, то все варианты остатка пробуются перед переходом наследующий вариант Альтернативы. Если варианты в левой Альтернативе исчерпаны,вместо левой Альтернативы пробуется правая Дизъюнкция. Любые захватывающиескобки внутри части шаблона, пропущенной оператором |, получают вместо строкзначение undefined. Таким образом, например,

/a|ab/.exec("abc")

возвращает результат "a", а не "ab". Кроме того,

/((a)|(ab))((c)|(bc))/.exec("abc")

возвращает массив

["abc", "a", "a", undefined, "bc", undefined, "bc"]

а не

["abc", "ab", undefined, "ab", "c", "c", undefined]

15.10.2.4 Альтернатива

Значение нетерминала Alternative :: [empty] вычисляется путём возврата Сличителя,который принимает два аргумента: Состояние x и Продолжение c, и возвращаетрезультат вызова c(x).

Page 205: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала Альтернатива :: Альтернатива Элемент вычисляется по следующейсхеме:

1. Вычислить значение Альтернативы, получив Сличитель m1.

2. Вычислить значение Элемента, получив Сличитель m2.

3. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Создать Продолжение d, которое получает аргумент-Состояние y и возвращаетрезультат вызова m2(y, c).

2. Вызвать m1(x, d) и вернуть результат вызова.

Поясняющие комментарии: Последовательно идущие Элементы пытаютсяодновременно найти соответствия в последовательно идущих частях строки. Если илевая Альтернатива, и правый Элемент, и остаток регулярного выражения обладаютточками ветвления, то все варианты остатка пробуются перед переходом на следующийвариант правого Элемента, а все варианты правого Элемента перебираются передпереходом на следующий вариант левой Альтернативы.

15.10.2.5 Элемент

Значение нетерминала Элемент :: Проверка вычисляется путём возврата внутреннегозамыкания-Сличителя, которое принимает два аргумента: Состояние x и Продолжение c,и производит следующие действия:

1. Вычислить значение Проверки, получив ПроверщикУсловия t.

2. Вызвать t(x), получив булевское значение r.

3. Если r равно false - вернуть failure.

4. Вызвать c(x) и вернуть результат вызова.

Значение нетерминала Элемент :: Атом вычисляется путём вычисления знания Атома,которое даёт Искатель, и возврата этого Искателя.

Значение нетерминала Элемент :: Атом ПризнакКоличества вычисляется по следующейсхеме:

1. Вычислить значение Атома, получив Сличитель m.

2. Вычислить значение ПризнакаКоличества, получив три значения: целое min, целое (или∞) max и булевское greedy.

3. Если max конечно и меньше min - бросить исключение SyntaxError.

4. Пусть parenIndex - число захватывающих скобок во всём регулярном выражении,которые встретились слева от символов, распознанных данным грамматическимправилом как Элемент. Оно равно сумме общего количества раз, когда правило Атом :: (Дизъюнкция ) было применено до Элемента текущего правила, и общего количества раз,которые правила Атом :: ( Дизъюнкция ) окружают данный Элемент.

Page 206: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

5. Пусть parenCount - число левых захватывающих скобок в составе Атома данногоправила. Оно равно общему количеству раз, когда правило Атом :: ( Дизюнкция )оказывается внутри Атома текущего правила.

6. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Вызвать СличительПовтора(m, min, max, greedy, x, c, parenIndex, parenCount) ивернуть результат вызова.

Внутренняя вспомогательная функция СличительПовтора принимает восемь аргументов:Сличитель m, целое min, целое (или ∞) max, булевское greedy, Состояние x,Продолжение c, целое parenIndex и целое parenCount - и производит следующиедействия:

1. Если max равно нулю - вызвать c(x) и вернуть результат вызова.

2. Создать внутреннее замыкание-Продолжение d, которое принимает единственныйаргумент - Состояние y, и производит следующие действия:

1. Если min равно нулю, а endIndex в y равен endIndex в x - вернуть failure.

2. Если min равно нулю, то положить min2 равным нулю. Иначе положить min2 равнымmin-1.

3. Если max равно ∞, то положить max2 равным ∞; иначе положить max2 равнымmax-1.

4. Вызвать СличительПовтора(m, min2, max2, greedy, x, c, parenIndex, parenCount) ивернуть результат вызова.

3. Пусть cap - новая копия внутреннего массива captures структуры x.

4. Для каждого целого k, удовлетворяющего условию parenIndex < k и k <=parenIndex+ parenCount, установить cap[k] равным undefined.

5. Пусть e равно endIndex структуры x.

6. Пусть xr - Состояние (e, cap).

7. Если min не равно нулю - вызвать m(xr, d) и вернуть результат вызова.

8. Если greedy равно true - переход на шаг 12.

9. Вызвать c(x) и присвоить z результат вызова.

10. Если z не равно failure - вернуть z.

11. Вызвать m(xr, d) и вернуть результат.

12. Вызвать m(xr, d) и присвоить z результат вызова.

13. Если z не равно failure - вернуть z.

Page 207: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

14. Вызвать c(x) и вернуть результат вызова.

Поясняющие комментарии: Атом, за которым следует ПризнакКоличества повторяетсячисло раз, указанное ПризнакомКоличества. Признак количества может быть "не-жадным" ("non-greedy") - в этом случае шаблон Атом повторяется наименьшеевозможное количество раз, при котором находится соответствие для остатка шаблона.Если же признак количества является "жадным" ("greedy"), шаблон Atom повторяетсямаксимальное возможное число раз, при котором всё ещё находится соответствие дляостатка шаблона. Повторяется шаблон Atom, а не соответствующая ему строка, так чторазные повторения Атома могут соответствовать различным подстрокам.

Если Atom и остаток регулярного выражения обладают точками ветвления, сначала дляАтома находится наибольшее (или, в случае не-жадности, наименьшее) количествопоследовательных соответствий. Все варианты остатка перебираются перед переходом кследующему варианту в последнем повторе Атома. Все варианты в последнем (n-ом)повторении Атома перебираются перед переходом к следующему варианту впредпоследнем ((n-1)-ом) повторении Атома. В этот момент может выясниться, чтотеперь доступно большее или меньшее количество повторений Атома. Эти комбинацииперебираются (снова начиная с либо с наименьшего, либо с наибольшего количества)перед переходом к следующему варианту (n-1)-го повторения Атома и т.д.

К примеру, сравним выражение

/a[a-z]{2,4}/.exec("abcdefghi")

которое возвращает "abcde" с

/a[a-z]{2,4}?/.exec("abcdefghi")

которое возвращает "abc".

Также рассмотрим выражение

/(aa|aabaac|ba|b|c)*/.exec("aabaac")

которое, согласно вышеописанному порядку перебора точек ветвления, возвращаетмассив

["aaba", "ba"]

а не какой-либо из:

["aabaac", "aabaac"] ["aabaac", "c"]

Вышеописанный порядок точек ветвления может быть использован для написаниярегулярного выражения, которое находит наибольший общий делитель двух чисел(представленных в унарной нотации). Следующий пример находит НОД 10 и 15:

"aaaaaaaaaa, aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/,"$1")

возвращает НОД в унарной нотации: "aaaaa".

Шаг 4 СличителяПовторов очищает массив захваченных значений Атома каждый раз,

Page 208: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

когда Атом повторяется. Это поведение может быть продемонстрировано регулярнымвыражением

/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")

которое возвращает массив

["zaacbbbcac", "z", "ac", "a", undefined, "c"]

а не

["zaacbbbcac", "z", "ac", "a", "bbb", "c"]

потому что с каждым повтором внешний * очищает все захваченные строки,находящиеся в повторяемом Атоме, который в данном случае включает захватываемыестроки с номерами 2, 3 и 4.

Шаг 1 замыкания d в СличителеПовторов гласит, что как только было найденоминимальное количество повторов, любые дополнительные трактовки Атома, которыесоответствуют пустой строке, не рассматриваются в качестве дополнительных повторов.Это защищает систему обработки регулярных выражений от зависания в бесконечномцикле на таких шаблонах, как:

/(a*)*/.exec("b")

или на несколько более сложном выражении:

/(a*)b\1+/.exec("baaaac")

которое возвращает массив

["b", ""]

15.10.2.6 Проверка

Значение нетерминала Assertion :: ^ вычисляется путём возврата внутреннего замыкания-ПроверщикаУсловия, который принимает единственный аргумент - Состояние x, ипроизводит следующие действия:

1. Пусть e равно endIndex структуры x.

2. Если e равно нулю - вернуть true.

3. Если Multiline равно false - вернуть false.

4. Если символ Input[e-1] - один из символов <LF>, <CR>, <LS> или <PS> - то вернутьtrue.

5. Вернуть false.

Значение нетерминала Assertion :: $ вычисляется путём возврата внутреннего замыкания-ПроверщикаУсловия, который принимает единственный аргумент - Состояние x, ипроизводит следующие действия:

Page 209: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Пусть e равно endIndex структуры x.

2. Если e равняется InputLength - вернуть true.

3. Если multiline равно false - вернуть false.

4. Если символ Input[e] - один из символов <LF>, <CR>, <LS> или <PS> - то вернутьtrue.

5. Вернуть false.

Значение нетерминала Assertion :: \b вычисляется путём возврата внутреннегозамыкания-ПроверщикаУсловия, который принимает единственный аргумент -Состояние x, и производит следующие действия:

1. Пусть e равно endIndex структуры x.

2. Вызвать функцию ЯвляетсяСимволомСлова(e-1), получив булевский результат a.

3. Вызвать ЯвляетсяСимволомСлова(e), получив булевский результат b.

4. Если a равно true, а b равно false - вернуть true.

5. Если a равно false, а b равно true - вернуть true.

6. Вернуть false.

Значение нетерминала Assertion :: \B вычисляется путём возврата внутреннегозамыкания-ПроверщикаУсловия, который принимает единственный аргумент -Состояние x, и производит следующие действия:

1. Пусть e равно endIndex структуры x.

2. Вызвать функцию ЯвляетсяСимволомСлова(e-1), получив булевский результат a.

3. Вызвать ЯвляетсяСимволомСлова(e), получив булевский результат b.

4. Если a равно true, а b равно false - вернуть false.

5. Если a равно false, а b равно true - вернуть false.

6. Вернуть true.

Внутренняя вспомогательная функция ЯвляетсяСимволомСлова принимаетцелочисленный параметр e и производит следующее:

1. Если e == -1 или e == InputLength - вернуть false.

2. Пусть c - символ Input[e].

3. Если c - один из шестидесяти трёх символов в нижнеприведённой таблице, то вернутьtrue.

a b c d e f g h i j k l m n o p q r s t u v w x y z

Page 210: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _

4. Вернуть false.

15.10.2.7 ПризнакКоличества

Значение нетерминала ПризнакКоличества :: ПрефиксПризнакаКоличества вычисляется последующей схеме:

1. Вычислить значение ПрефиксаПризнакаКоличества, получив два значения: целое min ицелое (или ∞) max.

2. Вернуть три результата: min , max и true.

Значение нетерминала ПризнакКоличества :: ПрефиксПризнакаКоличества ? вычисляетсяпо следующей схеме:

1. Вычислить значение ПрефиксаПризнакаКоличества, получив два значения: целое min ицелое (или ∞) max.

2. Вернуть три результата: min , max и false.

Значение нетерминала ПрефиксПризнакаКоличества :: * равняется паре значений 0 и ∞.

Значение нетерминала ПрефиксПризнакаКоличества :: + равняется паре значений 1 и ∞.

Значение нетерминала ПрефиксПризнакаКоличества :: ? равняется паре значений 0 и 1.

Значение нетерминала ПрефиксПризнакаКоличества :: { ДесятичныеЦифры } вычисляетсяпо следующей схеме:

1. Пусть i равно МЗ ДесятичныхЦифр (см. раздел 7.8.3).

2. Вернуть два результата: i и i.

Значение нетерминала ПрефиксПризнакаКоличества :: { ДесятичныеЦифры ,} вычисляетсяпо следующей схеме:

1. Пусть i равно МЗ ДесятичныхЦифр.

2. Вернуть два результата i и ∞.

Значение нетерминала ПрефиксПризнакаКоличества :: { ДесятичныеЦифры ,ДесятичныеЦифры } вычисляется по следующей схеме:

1. Пусть i - МЗ первых ДесятичныхЦифр.

2. Пусть j - МЗ вторых ДесятичныхЦифр.

3. Вернуть два результата: i и j.

15.10.2.8 Атом

Значение нетерминала Атом :: СимволШаблона вычисляется по следующей схеме:

Page 211: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

1. Пусть ch - символ, представленный СимволомШаблона.

2. Пусть A - НаборСимволов, содержащий единственный символ ch.

3. Вызвать СличительСНаборомСимволов(A, false) и вернуть результирующий Сличитель.

Значение нетерминала Атом :: . вычисляется по следующей схеме:

1. Пусть A - множество всех символов за исключением <LF>, <CR>, <LS> и <PS>.

2. Вызвать СличительСНаборомСимволов(A, false) и вернуть результирующий Сличитель.

Значение нетерминала Атом :: \ EscapeАтом вычисляется путём вычисления значенияEscapeАтома и возврата результирующего Сличителя.

Значение нетерминала Атом :: КлассСимволов вычисляется по следующей схеме:

1. Вычислить значение КлассаСимволов, получив НаборСимволов A и булевское invert.

2. Вызвать СличительСНаборомСимволов(A, invert) и вернуть результирующий Сличитель.

Значение нетерминала Атом :: ( Дизъюнкция ) вычисляется по следующей схеме:

1. Вычислить значение Дизъюнкции, получив Сличитель m.

2. Пусть parenIndex - число захватывающих скобок во всём регулярном выражении,которые встретились слева от распознанной данным грамматическим правиломоткрывающей скобки. Оно равно сумме общего количества раз, когда правило Атом :: (Дизъюнкция ) было применено до Атома текущего правила, и общего количества раз,которые правила Атом :: ( Дизъюнкция ) окружают данный Атом.

3. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Создать внутреннее замыкание-Продолжение d, которое принимает единственныйаргумент - Состояние y, и производит следующие действия:

1. Пусть cap - новая копия внутреннего массива captures структуры y.

2. Пусть xe равно endIndex структуры x.

3. Пусть ye равно endIndex структуры y.

4. Пусть s - новая строка, состоящая из символов строки Input на позициях с xe(включительно) по ye (не включительно).

5. Установить cap[ parenIndex+1] равным s.

6. Пусть z - Состояние (ye, cap).

7. Вызвать c(z) и вернуть результат вызова.

2. Вызвать m(x, d) и вернуть результат вызова. Значение нетерминала Атом :: (?:

Page 212: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Дизъюнкция ) вычисляется путём вычисления значения Дизъюнкции и возвратарезультирующего Сличителя.

Значение нетерминала Атом :: (?= Дизъюнкция ) вычисляется по следующей схеме:

1. Вычислить значение Дизъюнкции, получив Сличитель m.

2. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Пусть d - Продолжение, которое всегда возвращает свой аргумент Состояние какуспешный MatchResult.

2. Вызвать m(x, d), получив результат r.

3. Если r равно failure - вернуть failure.

4. Пусть y равно Состоянию структуры r.

5. Пусть cap - массив captures структуры y.

6. Пусть xe равно endIndex структуры x.

7. Пусть z - Состояние (xe, cap).

8. Вызвать c(z) и вернуть результат вызова.

Значение нетерминала Атом :: (?! Дизъюнкция ) вычисляется по следующей схеме:

1. Вычислить значение Дизъюнкции, получив Сличитель m.

2. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Пусть d - Продолжение, которое всегда возвращает свой аргумент Состояние какуспешный MatchResult.

2. Вызвать m(x, d), получив результат r.

3. Если r не равно failure - вернуть failure.

4. Вызвать c(x) и вернуть результат вызова.

Внутренняя вспомогательная функция СличительСНаборомСимволов принимает двааргумента: НаборСимволов A и булевский флаг invert - и производит следующиедействия:

1. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Пусть e равно endIndex структуры x.

2. Если e ==InputLength - вернуть failure.

Page 213: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

3. Пусть c - символ Input[e].

4. Пусть cc равно результату вызова КаноническаяФорма(c).

5. Если invert равно true - переход на шаг 8.

6. Если во множестве A не существует такого элемента a, что КаноническаяФорма(a)==cc - вернуть failure.

7. Переход на шаг 9.

8. Если во множестве A существует такой элемент a, что КаноническаяФорма(a)== cc -вернуть failure.

9. Пусть cap - массив captures структуры x.

10. Пусть y - Состояние (e+1, cap).

11. Вызвать c(y) и вернуть результат вызова.

Внутренняя вспомогательная функция КаноническаяФорма принимает параметр-символch и производит следующее:

1. Если IgnoreCase равно false - вернуть ch.

2. Пусть u равно ch, приведённому к верхнему регистру, как будто функцияString.prototype.toUpperCase была вызвана для строки из одного символа ch.

3. Если u не состоит из единственного символа - вернуть x.

4. Пусть cu - символ u.

5. Если код ch больше или равен десятичному 128, а код cu меньше десятичного 128 -вернуть ch.

6. Вернуть cu.

Поясняющие комментарии: Скобки вида ( Дизъюнкция ) служат как для группировкикомпонент шаблона Дизъюнкция, так и для сохранения результата нахождениясоответствия. Результат может использоваться для обратной ссылки ( "\", за которымследует ненулевое десятичное число), на него может ссылаться заменяющая строка, илион может быть возвращён как часть результирующего массива функции поискасоответствий для регулярного выражения. Чтобы подавить функциональность захвата длякруглых скобок, следует использовать конструкцию (?: Дизъюнкция ).

Конструкция (?= Дизъюнкция ) означает положительный предпросмотр нулевой ширины.Чтобы соответствие этой конструкции было успешным, для шаблона Дизъюнкция должнонайтись соответствие в текущей позиции, но текущая позиция не меняется до перехода кпоиску соответствия для остатка шаблона. Если для Дизъюнкции на данной позициинаходится несколько соответствий, пробуется только первая. В отличие от другихоператоров регулярных выражений, конструкция (?= не пользуется перебором свозвратом (это необычное поведение унаследовано из Perl). Это влияет на результаттолько в том случае, когда Дизъюнкция содержит захватывающие скобки, на которые

Page 214: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

потом ссылается остаток регулярного выражения.

Например,

/(?=(a+))/.exec("baaabac")

находит соответствие в пустой строке непосредственно за первым b и, таким образом,возвращает массив:

["", "aaa"]

Чтобы проиллюстрировать отсутствие перебора с возвратом, рассмотрим шаблон:

/(?=(a+))a*b\1/.exec("baaabac")

Это выражение возвращает

["aba", "a"]

а не

["aaaba", "a"]

Конструкция (?! Дизъюнкция ) означает отрицательный предпросмотр нулевой ширины.Чтобы соответствие этой конструкции было успешным, для шаблона Дизъюнкция недолжно найтись соответствия в текущей позиции. Текущая позиция не меняется доперехода к поиску соответствия для остатка шаблона. Дизъюнкция может содержатьзахватывающие скобки, но ссылки на них имеют смысл только внутри самойДизъюнкции. Обратные ссылки на эти захватывающие скобки из других мест шаблонабудут всегда возвращать undefined, потому что для того, чтобы для шаблона нашлосьсоответствие, его не должно найтись для отрицательного предпросмотра. Например,

/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")

ищет a, за которым не следует непосредственно последовательность из некоторогоположительного количества n символов a, символа b, ещё n символов a (на которыеуказывает первая ссылка \2) и символа c. Вторая ссылка \2 находится снаружиотрицательного предпросмотра, поэтому она ищет соответствие для undefined и, такимобразом, всегда его находит. Всё выражение возвращает массив:

["baaabaac", "ba", undefined, "abaac"]

В случае поиска регистро-независимого соответствия, все символы автоматическипредварительно преобразовываются к верхнему регистру. Однако если преобразованиесимвола к верхнему регистру превратит его в более, чем один символ (например,преобразование "ß" ((u00DF) в "SS"), то символ оставляется в первоначальном виде. Символтакже оставляется в первоначальном виде, если первоначально он не является символомASCII, но преобразование его к верхнему регистру превратит его в символ ASCII. Этосделано для того, чтобы такие символы Юникода, как \u0131 и \u017F не соответствовалитаким регулярным выражениям, как /[a-z]/i, которые должны соответствовать толькосимволам ASCII. Более того, если бы такие преобразования были разрешены, /[^\W]/iсоответствовало бы любому из символов a, b,..., h, но не i или s.

Page 215: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.10.2.9 EscapeАтом

Значение нетерминала EscapeАтом :: ДесятичнаяEscape вычисляется по следующей схеме:

1. Вычислить значение ДесятичнойEscape, получив EscapeЗначение E.

2. Если E - не символ, то переход на шаг 6.

3. Пусть ch - символ E.

4. Пусть A - НаборСимволов, содержащий единственный символ ch.

5. Вызвать СличительСНаборомСимволов(A, false) и вернуть результирующий Сличитель.

6. E должно быть целым числом. Пусть n - это целое.

7. Если n= 0 или n> NCapturingParens - бросить исключение SyntaxError.

8. Вернуть внутреннее замыкание-Сличитель, которое принимает два аргумента:Состояние x и Продолжение c - и производит следующие действия:

1. Пусть cap - массив captures структуры x.

2. Пусть s равно cap[n].

3. Если s равно undefined - вызвать c(x) и вернуть результат вызова.

4. Пусть e равно endIndex структуры x.

5. Пусть len равно длине s.

6. Пусть f равно e + len.

7. Если f > InputLength - вернуть failure.

8. Если существует целое i от 0 (включительно) до len (не включительно) такое, чтоКаноническаяФорма(s[i]) не равняется тому же символу, что иКаноническаяФорма(Input[e+i]), - вернуть failure.

9. Пусть y равно Состоянию(f, cap).

10. Вызвать c(y) и вернуть результат вызова.

Значение нетерминала EscapeАтом :: СимвольнаяEscape вычисляется по следующей схеме:

1. Вычислить значение СимвольнойEscape, получив символ ch.

2. Пусть A - НаборСимволов, содержащий единственный символ ch.

3. Вызвать СличительСНаборомСимволов(A, false) и вернуть результирующий Сличитель.

Значение нетерминала EscapeАтом :: EscapeКлассаСимвола вычисляется по следующейсхеме:

1. Вычислить значение EscapeКлассаСимвола, получив НаборСимволов A.

Page 216: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Вызвать СличительСНаборомСимволов(A, false) и вернуть результирующий Сличитель.

Поясняющие комментарии: Escape-последовательность в форме \, за которой следуетненулевое десятичное число n соответствует результату захвата n-й парызахватывающих скобок (см. раздел 15.10.2.11). Если в регулярном выражении меньше nзахватывающих скобок - выдаётся ошибка. Если в регулярном выражении n или болеепар захватывающих скобок, но значение n-й равно undefined, потому что она ничего незахватила, то считается что для обратной ссылки всегда находится соответствие.

15.10.2.10 СимвольнаяEscape

Значение нетерминала СимвольнаяEscape :: УправляющаяEscape вычисляется путёмвозврата символа в соответствии с таблицей снизу:

УправляющаяEscape Значение Юникода Наименование Символt \u0009 горизонтальная табуляция <HT>n \u000A перевод строки (новая строка) <LF>v \u000B вертикальная табуляция <VT>f \u000C перевод страницы <FF>r \u000D возврат каретки <CR>

Значение нетерминала СимвольнаяEscape :: c УправляющийСимвол вычисляется последующей схеме:

1. Пусть ch - символ, представленный УправляющимСимволом.

2. Пусть i - код ch.

3. Пусть j - остаток от деления i на 32.

4. Вернуть символ Юникода с номером j.

Значение нетерминала СимвольнаяEscape ::ШестнадцатеричнаяEscapeПоследовательность вычисляется путём вычисления значенияСиЗ ШестнадцатеричнойEscapeПоследовательности (см. раздел 7.8.4) и возврата этогосимвола.

Значение нетерминала СимвольнаяEscape :: ЮникоднаяEscapeПоследовательностьвычисляется путём вычисления значения СиЗ ЮникоднойEscapeПоследовательности (см.раздел 7.8.4) и возврата этого символа.

Значение нетерминала СимвольнаяEscape :: EscapeИдентификатора вычисляется путёмвозврата символа, представленного EscapeИдентификатора.

15.10.2.11 ДесятичнаяEscape

Значение нетерминала ДесятичнаяEscape :: ДесятичныйЦелыйЛитерал [предпросмотр ДесятичнаяЦифра] вычисляется по следующей схеме:

1. Пусть i - МЗ ДесятичногоЦелогоЛитерала.

Page 217: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

2. Если i равно нулю - вернуть EscapeЗначение, состоящее из символа <NUL> (значениеЮникода 0000).

3. Вернуть EscapeЗначение, состоящее из целого числа i.

Определение "МЗ ДесятичногоЦелогоЛитерала" приведено в разделе 7.8.3.

Поясняющие комментарии: Если за \ следует десятичное число n, первая цифракоторого не равна 0, то escape-последовательность считается обратной ссылкой. Если nбольше общего числа левых захватывающих скобок во всём регулярном выражении -выводится сообщение об ошибке. Обозначение \0 представляет символ NUL, и за ним неможет следовать десятичная цифра.

15.10.2.12 EscapeКлассаСимвола

Значение нетерминала EscapeКлассаСимвола :: d вычисляется путём возврата множестваиз десяти элементов, содержащего символы от 0 до 9 включительно.

Значение нетерминала EscapeКлассаСимвола :: D вычисляется путём возврата множествавсех символов, не включённых в множество, возвращаемое EscapeКлассаСимвола :: d.

Значение нетерминала EscapeКлассаСимвола :: s вычисляется путём возврата множества,содержащего символы, находящиеся на правой стороне правил Пробел (раздел 7.2) иКонецСтроки (раздел 7.3).

Значение нетерминала EscapeКлассаСимвола :: S вычисляется путём возврата множествавсех символов, не включённых в множество, возвращаемое EscapeКлассаСимвола :: s.

Значение нетерминала EscapeКлассаСимвола :: w вычисляется путём возврата множествасимволов, содержащего шестьдесят три элемента:

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _

Значение нетерминала EscapeКлассаСимвола :: W вычисляется путём возврата множествавсех символов, не включённых в множество, возвращаемое EscapeКлассаСимвола :: w.

15.10.2.13 КлассСимволов

Значение нетерминала КлассСимволов :: [ [предпросмотр {^}] ДиапазоныКласса ]

вычисляется путём вычисления значения ДиапазоновКласса и возвращения полученногоНабораСимволов и булевского значения false.

Значение нетерминала КлассСимволов :: [ [^ ДиапазоныКласса ] вычисляется путёмвычисления значения ДиапазоновКласса и возвращения полученного НабораСимволов ибулевского значения true.

15.10.2.14 ДиапазоныКласса

Значение нетерминала ДиапазоныКласса :: [пусто] вычисляется путём возврата пустогоНабораСимволов.

Page 218: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала ДиапазоныКласса :: НепустыеДиапазоныКласса вычисляется путёмвычисления значения НепустыеДиапазоныКласса и возврата полученногоНабораСимволов.

15.10.2.15 НепустыеДиапазоныКласса

Значение нетерминала НепустыеДиапазоныКласса :: АтомКласса вычисляется путёмвычисления значения АтомаКласса и возврата полученного НабораСимволов.

Значение нетерминала НепустыеДиапазоныКласса :: АтомКлассаНепустыеДиапазоныКлассаБезТире вычисляется по следующей схеме:

1. Вычислить значение АтомаКласса, получив НаборСимволов A.

2. Вычислить значение НепустыхДиапазоновКлассаБезТире, получив НаборСимволов B.

3. Вернуть объединение НаборовСимволов A и B.

Значение нетерминала НепустыеДиапазоныКласса :: АтомКласса - АтомКлассаДиапазоныКласса вычисляется по следующей схеме:

1. Вычислить значение первого АтомаКласса, получив НаборСимволов A.

2. Вычислить значение второго АтомаКласса, получив НаборСимволов B.

3. Вычислить значение ДиапазоновКласса, получив НаборСимволов C.

4. Вызвать ДиапазонСимволов(A, B), получив НаборСимволов D.

5. Вернуть объединение НаборовСимволов D и C.

Внутренняя вспомогательная функция ДиапазонСимволов принимает два аргумента A и Bтипа НаборСимволов и производит следующие действия:

1. Если A не содержит в точности один символ, или B не содержит в точности одинсимвол - бросить исключение SyntaxError.

2. Пусть a - один символ НабораСимволов A.

3. Пусть b - один символ НабораСимволов B.

4. Пусть i - код символа a.

5. Пусть j - код символа b.

6. Если I > j - бросить исключение SyntaxError.

7. Вернуть множество, содержащее все символы с номерами от i до j включительно.

15.10.2.16 НепустыеДиапазоныКлассаБезТире

Значение нетерминала НепустыеДиапазоныКлассаБезТире :: АтомКласса вычисляетсяпутём вычисления значения АтомаКласса и возврата полученного НабораСимволов.

Page 219: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала НепустыеДиапазоныКлассаБезТире :: АтомКлассаБезТиреНепустыеДиапазоныКлассаБезТире вычисляется по следующей схеме:

1. Вычислить значение АтомаКлассаБезТире, получив НаборСимволов A.

2. Вычислить значение НепустыхДиапазоновКлассаБезТире, получив НаборСимволов B.

3. Вернуть объединение НаборовСимволов A и B.

Значение нетерминала НепустыеДиапазоныКлассаБезТире :: АтомКлассаБезТире -АтомКласса ДиапазоныКласса вычисляется по следующей схеме:

1. Вычислить значение АтомаКлассаБезТире, получив НаборСимволов A.

2. Вычислить значение АтомаКласса, получив НаборСимволов B.

3. Вычислить значение ДиапазоновКласса, получив НаборСимволов C.

4. Вызвать ДиапазонСимволов(A, B), получив НаборСимволов D.

5. Вернуть объединение НаборовСимволов D и C.

Поясняющие комментарии: ДиапазоныКласса могут состоять из одиночныхАтомовКласса и/или диапазонов из двух АтомовКласса, разделённых тире. В последнемслучае ДиапазоныКласса включают все символы между первым АтомомКласса и вторымАтомомКласса включительно. Если один из АтомовКласса не представляет собойодиночный символ (например, равен \w) или если код первого АтомаКласса больше кодавторого АтомаКласса.

Даже если шаблон не чувствителен к регистру, регистр двух концов диапазона имеетзначение при определении того, какие символы относятся к этому диапазону. Такимобразом, например, шаблон /[E-F]/ i соответствует только символам E, F, e и f, ашаблон /[E-f]/ i соответствует как всем символам ASCII нижнего и верхнего регистра,так и символам [, \, ], ^, _ и `.

Символ - может обрабатываться буквально или обозначать диапазон. Он обрабатываетсябуквально, если является первым или последним символом ДиапазоновКласса,начальным или конечным пределом описания диапазона или непосредственно следуетза описанием диапазона.

15.10.2.17 АтомКласса

Значение нетерминала АтомКласса :: - вычисляется путём возврата множества символов,содержащего единственный символ -.

Значение нетерминала АтомКласса :: АтомКлассаБезТире вычисляется путём вычислениязначения АтомаКлассаБезТире и возврата полученного НабораСимволов.

15.10.2.18 АтомКлассаБезТире

Значение нетерминала АтомКлассаБезТире :: ИсходныйСимвол но не один из \ ] -вычисляется путём возврата множества символов, содержащего единственный элементИсходныйСимвол.

Page 220: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значение нетерминала АтомКлассаБезТире :: \ EscapeКласса вычисляется путёмвычисления значения EscapeКласса и возврата полученного НабораСимволов.

15.10.2.19 EscapeКласса

Значение нетерминала EscapeКласса :: ДесятичнаяEscape вычисляется по следующейсхеме:

1. Вычислить значение ДесятичнойEscape, получив EscapeЗначение E.

2. Если E не символ - бросить исключение SyntaxError.

3. Пусть ch - символ E.

4. Вернуть НаборСимволов из одного элемента, содержащий символ ch.

Значение нетерминала EscapeКласса :: b вычисляется путём возврата множества символов,содержащего единственный символ <BS> (значение Юникода 0008).

Значение нетерминала EscapeКласса :: СимвольнаяEscape вычисляется путём вычислениязначения СимвольнойEscape, равного символу, и возврату НабораСимволов,содержащего этот символ в качестве единственного элемента.

Значение нетерминала EscapeКласса :: EscapeКлассаСимвола вычисляется путёмвычисления значения EscapeКлассаСимвола и возврата полученного НабораСимволов.

Поясняющие комментарии: АтомКласса может использовать любую escape-последовательность, разрешённую в остальных частях регулярного выражения, кроме \b,\B и обратных ссылок. Внутри КлассаСимволов \b обозначает символ backspace, а \B иобратные ссылки вызвают сообщение об ошибке. Использование обратной ссылки вАтомеКласса вызывает ошибку.

15.10.3 Вызов конструктора RegExp как функции15.10.3.1 RegExp(pattern, flags)

Если pattern является объектом R, значение свойства [[Class]] которого равно "RegExp", аflags равно undefined - вернуть R без изменений. Иначе вызвать конструктор RegExp (см.раздел 15.10.4.1), передав ему аргументы pattern и flags, и вернуть объект, созданныйэтим конструктором.

15.10.4 Конструктор RegExp

Когда RegExp вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.10.4.1 new RegExp(pattern, flags)

Если pattern является объектом R, значение свойства [[Class]] которого равно "RegExp", аflags равно undefined, то пусть P равно pattern, использованному для создания R, а F -значению flags, использованному для создания R. Если pattern является объектом R,значение свойства [[Class]] которого равно "RegExp", а flags не равно undefined - броситьисключение TypeError. Иначе пусть P равно пустой строке, если pattern равноundefined, или ToString(pattern) в ином случае, и пусть F - пустая строка, если flags

Page 221: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

равно undefined, или ToString(flags) в ином случае.

Свойство global создаваемого объекта устанавливается в значение типа Boolean, равноеtrue, если F содержит символ "g", или false в ином случае.

Свойство ignoreCase создаваемого объекта устанавливается в значение типа Boolean,равное true, если F содержит символ "i", или false в ином случае.

Свойство multiline создаваемого объекта устанавливается в значение типа Boolean,равное true, если F содержит символ "m", или false в ином случае.

Если F содержит какой-либо символ, отличный от "g", "i" или "m", или содержит одинсимвол более одного раза - бросить исключение SyntaxError.

Если символы P не имеют вида Шаблон - бросить исключение SyntaxError. Иначе создатьв создаваемом объекте свойство [[Match]], равное результату вычисления значения("компиляции") Шаблона. Заметим, что вычисление значения Шаблона может броситьисключение SyntaxError. (Замечание: если pattern является СтроковымЛитералом, тообычные замены escape-последовательностей производятся до того, как строкаобработана RegExp. Если pattern должно содержать escape-последовательности, которыераспознаются RegExp, символ "\" должен быть экранировать в СтроковомЛитерале, чтобыпредотвратить его исчезновение в момент формирования СтроковогоЛитерала.)

Свойство source создаваемого объекта устанавливается в зависимое от реализациипредставление Шаблона, основанного на P.

Свойство lastIndex создаваемого объекта устанавливается равным 0.

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу RegExp, т.е. тому, который представляет собой первоначальноезначение RegExp.prototype.

Свойство [[Class]] создаваемого объекта устанавливается в "RegExp".

15.10.5 Свойства конструктора RegExp

Значением внутреннего свойства [[Prototype]] конструктора RegExp является объект-прототип Function (см. раздел 15.3.4).

Кроме внутренних свойств и свойства length (значение которого равно 2), конструкторRegExp обладает следующими свойствами:

15.10.5.1 RegExp.prototype

Начальным значением RegExp.prototype является объект-прототип RegExp (см. раздел15.10.6).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.10.6 Свойства объекта-прототипа RegExp

Значением внутреннего свойства [[Prototype]] объекта-прототипа RegExp являетсяобъект-прототип Object . Значением внутреннего свойства [[Class]] объекта-прототипа

Page 222: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

RegExp является "Object".

Объект-прототип RegExp не обладает своим собственным свойством valueOf, однако оннаследует свойство valueOf от объекта-прототипа Object.

В последующих описаниях функций, являющихся свойствами объекта-прототипа RegExp,словосочетание "данный объект RegExp" относится к значению this, переданному привызове этой функции. Если значение this не является объектом, для которого значениемвнутреннего свойства [[Class]] является "RegExp", бросается исключение TypeError.

15.10.6.1 RegExp.prototype.constructor

Начальным значением RegExp.prototype.constructor является встроенный конструкторRegExp.

15.10.6.2 RegExp.prototype.exec(string)

Производит поиск в строке string соответствия для регулярного выражения и возвращаетобъект типа Array, содержащий результаты поиска, или null, если соответствия ненашлось.

Поиск вхождения регулярного выражения в строке ToString(string) производится последующей схеме:

1. Пусть S - значение ToString(string).

2. Пусть length - длина S.

3. Пусть lastIndex - значение свойства lastIndex property.

4. Пусть i - значение ToInteger(lastIndex).

5. Если свойство global равно false - установить i =0.

6. Если i <0 или i > length, то установить lastIndex равным 0 и вернуть null.

7. Вызвать [[Match]], передав ему аргументы S и i. Если [[Match]] вернул failure - переходна шаг 8. Иначе приравнять r его результату типа Состояние и перейти на шаг 10.

8. Пусть i = i + 1.

9. Переход на шаг 6.

10. Пусть e - значение endIndex структуры r.

11. Если свойство global равно true - установить lastIndex равным e.

12. Пусть n - длина массива captures структуры r. (Это то же значение, что иNCapturingParens в разделе 15.10.2.1.)

13. Вернуть новый массив со следующими свойствами:

Свойство index установлено равным номеру позиции в полной строке S, на которойнашлась подстрока-соответствие.

Page 223: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Свойство input установлено в S.Свойство length установлено в n +1.Свойство 0 установлено равным подстроке-соответствию (т. е. части S с позиции iвключительно по позицию e не включительно).Для каждого целого i, такого, что i >0 и i <= n, - установить свойство ToString(i)равным i-му элементу массива captures структуры r.

15.10.6.3 RegExp.prototype.test(string)

Эквивалентно выражению RegExp.prototype.exec(string) != null.

15.10.6.4 RegExp.prototype.toString()

Пусть src - строка в виде Шаблона, представляющая текущее регулярное выражение. srcможет быть или не быть идентичной свойству source или исходному коду, переданномуконструктору RegExp. Однако если src было бы передано конструктору RegExp вместе сфлагами текущего регулярного выражения - результирующее регулярное выражениедолжно было бы вести себя идентично текущему регулярному выражению.

toString возвращает строковое значение, составленное путём конкатенации строк "/", srcи "/", плюс символ "g", если свойство global равно true, символ "i", если свойствоignoreCase равно true, и символ "m", если свойство multiline равно true.

ЗАМЕЧАНИЕРеализация может воспользоваться возможностью сделать src отличным от исходноготекста, переданного конструктору RegExp, чтобы экранировать специальные символы вsrc. Например, если регулярное выражение было получено из выражения new RegExp("/"),то некоторыми из возможных вариантов src являются "/" и "\/". Второй вариантпозволяет полному результату ("/\//") вызова toString иметь видЛитералаРегулярногоВыражения.

15.10.7 Свойства экземпляров RegExp

Экземпляры типа RegExp наследуют, согласно вышеприведённому описанию, свойствасвоего объекта [[Prototype]], а также обладают следующими свойствами:

15.10.7.1 source

Значением свойства source является строка в форме Шаблона, представляющая текущеерегулярное выражение. Это свойство должно обладать атрибутами { DontEnum,DontDelete, ReadOnly }.

15.10.7.2 global

Значение свойства global имеет тип Boolean и обозначает, содержался ли во флагахсимвол "g". Это свойство должно обладать атрибутами { DontEnum, DontDelete, ReadOnly}.

15.10.7.3 ignoreCase

Значение свойства ignoreCase имеет тип Boolean и обозначает, содержался ли во флагахсимвол "i". Это свойство должно обладать атрибутами { DontEnum, DontDelete, ReadOnly}.

Page 224: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.10.7.4 multiline

Значение свойства multiline имеет тип Boolean и обозначает, содержался ли во флагахсимвол "m". Это свойство должно обладать атрибутами { DontEnum, DontDelete, ReadOnly}.

15.10.7.5 lastIndex

Значение свойства lastIndex равно целому числу, которое обозначает позицию, с которойначнётся следующий поиск соответствия. Это свойство должно обладать атрибутами {DontEnum, DontDelete }.

15.11 Объекты Error

Экземпляры объектов Error ("ошибка") бросаются как исключения, когда происходятошибки исполнения. Объекты Error также могут служить базовыми объектами дляпользовательских классов-исключений.

15.11.1 Вызов конструктора Error как функции

Когда Error вызывается не как конструктор, а как функция, он создаёт и инициализируетновый объект типа Error. Таким образом, вызов функции Error(...) эквивалентенвыражению создания объекта new Error(...), вызванному с теми же аргументами.

15.11.1.1 Error (message)

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Error, т.е. тому, который представляет собой первоначальноезначение Error.prototype (см. раздел 15.11.3.1).

Свойство [[Class]] создаваемого объекта устанавливается в "Error".

Если аргумент message не равен undefined, свойство message создаваемого объектаустанавливается в ToString(message).

15.11.2 Конструктор Error

Когда Error вызывается при помощи выражения new, он является конструктором, т.е.создаёт и инициализирует новый объект.

15.11.2.1 new Error (message)

Свойство [[Prototype]] создаваемого объекта устанавливается равным первоначальномуобъекту-прототипу Error, т.е. тому, который представляет собой первоначальноезначение Error.prototype (см. раздел 15.11.3.1).

Свойство [[Class]] создаваемого объекта типа Error устанавливается в "Error".

Если аргумент message не равен undefined, свойство message создаваемого объектаустанавливается в ToString(message).

15.11.3 Свойства конструктора Error

Page 225: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Значением внутреннего свойства [[Prototype]] конструктора Error является объект-прототип Function (см. раздел 15.3.4).

Кроме внутренних свойств и свойства length (значение которого равно 1), конструкторError обладает следующим свойством:

15.11.3.1 Error.prototype

Начальным значением Error.prototype является объект-прототип Error (см. раздел15.11.4).

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.11.4 Свойства объекта-прототипа Error

Объектом-прототипом Error является также объект Error (его [[Class]] равен "Error").

Значением внутреннего свойства [[Prototype]] объекта-прототипа Error является объект-прототип Object (15.2.3.1).

15.11.4.1 Error.prototype.constructor

Начальным значением Error.prototype.constructor является встроенный конструктор Error.

15.11.4.2 Error.prototype.name

Начальным значением свойства Error.prototype.name является "Error".

15.11.4.3 Error.prototype.message

Начальным значением свойства Error.prototype.message является зависящая от реализациистрока.

15.11.4.4 Error.prototype.toString ()

Возвращает определённую реализацией строку.

15.11.5 Свойства экземпляров Error

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

15.11.6 Встроенные типы ошибок, использованные в данном стандарте

Один из описанных ниже объектов типа NativeError бросается, когда обнаруживаетсяошибка выполнения. Все эти объекты имеют общую структуру, описанную в разделе15.11.7.

15.11.6.1 EvalError

Указывает на то, что глобальная функция eval была использована несовместимым с еёопределением образом. См. 15.1.2.1.

15.11.6.2 RangeError

Page 226: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Указывает, что численное значение вышло за пределы допустимого диапазона. См.разделы 15.4.2.2, 15.4.5.1, 15.7.4.5, 15.7.4.6 и 15.7.4.7.

15.11.6.3 ReferenceError

Указывает на то, что было обнаружено неверное ссылочное значение. См. разделы 8.7.1и 8.7.2.

15.11.6.4 SyntaxError

Указывает на ошибку разбора исходного кода (парсинга). См. разделы 15.1.2.1, 15.3.2.1,15.10.2.5, 15.10.2.9, 15.10.2.15, 15.10.2.19 и 15.10.4.1.

15.11.6.5 TypeError

Указывает на то, что тип переданного операнда отличается от ожидаемого. См. разделы8.6.2, 8.6.2.6, 9.9, 11.2.2, 11.2.3, 11.8.6, 11.8.7, 15.3.4.2, 15.3.4.3, 15.3.4.4, 15.3.5.3,15.4.4.2, 15.4.4.3, 15.5.4.2, 15.5.4.3, 15.6.4, 15.6.4.2, 15.6.4.3, 15.7.4, 15.7.4.2,15.7.4.4, 15.9.5, 15.9.5.9, 15.9.5.27, 15.10.4.1 и 15.10.6.

15.1.6.6 URIError

Указывает на то, что одна из глобальных функций, предназначенных для работы с URI,была использована несовместимым с её определением образом. См. раздел 15.1.3.

15.11.7 Структура объекта типа NativeError

Когда реализация ECMAScript обнаруживает ошибку выполнения, она бросает экземпляродного из объектов типа NativeError, определённых в разделе 15.11.6. Все эти объектыобладают описанной ниже структурой и различаются только именами, которыеиспользуются в качестве имёни конструкторов вместо NativeError, значениями свойстваname объектов-прототипов и значениями определяемого реализацией свойства messageобъектов-прототипов.

Для каждого объекта ссылки на NativeError следует заменять на соответствующее имяобъекта-ошибки из раздела 15.11.6.

15.11.7.1 NativeError Constructors Called as Functions

Когда NativeError вызывается не как конструктор, а как функция, он создаёт иинициализирует новый объект. Таким образом, вызов объекта как функции эквивалентенвызову его как конструктора с теми же аргументами.

15.11.7.2 NativeError (message)

Свойство [[Prototype]] создаваемого объекта устанавливается в объект-прототип дляданного конструктора ошибки. Свойство [[Class]] создаваемого объекта устанавливаетсяв "Error".

Если аргумент message не равен undefined, свойство message создаваемого объектаустанавливается в ToString(message).

15.11.7.3 Конструкторы NativeError

Page 227: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Когда конструктор NativeError вызывается при помощи выражения new, он являетсяконструктором, т.е. создаёт и инициализирует новый объект.

15.11.7.4 New NativeError (message)

Свойство [[Prototype]] создаваемого объекта устанавливается в объект-прототип дляданного конструктора NativeError. Свойство [[Class]] создаваемого объектаустанавливается в "Error".

Если аргумент message не равен undefined, свойство message создаваемого объектаустанавливается в ToString(message).

15.11.7.5 Свойства конструкторов NativeError

Значением внутреннего свойства [[Prototype]] конструктора NativeError является объект-прототип Function (см. раздел 15.3.4).

Кроме внутренних свойств и свойства length (значение которого равно 1), конструкторNativeError обладает следующим свойством:

15.11.7.6 NativeError. prototype

Начальным значением NativeError.prototype является объект-прототип NativeError (см.раздел 15.11.7.7). Каждый конструктор NativeError обладает отдельным объектом-прототипом.

Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.

15.11.7.7 Свойства объектов-прототипов NativeError

Каждый объект-прототип NativeError является объектом типа Error (его [[Class]] равен"Error").

Значением внутреннего свойства [[Prototype]] каждого объекта-прототипа NativeErrorявляется объект-прототип Error (15.11.4).

15.11.7.8 NativeError.prototype.constructor

Начальным значением свойства constructor прототипа какого-либо конструктораNativeError является сама же функция-конструктор NativeError (15.11.7).

15.11.7.9 NativeError.prototype.name

Начальным значением свойства name прототипа какого-либо конструктора NativeErrorявляется имя конструктора (имя, используемое вместо NativeError).

15.11.7.10 NativeError.prototype.message

Начальным значением свойства name прототипа какого-либо конструктора NativeErrorявляется определённая реализацией строка.

ЗАМЕЧАНИЕПрототипы конструкторов NativeError сами не определяют функцию toString, ноэкземпляры ошибок наследуют её от объекта-прототипа Error.

Page 228: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

15.11.7.11 Свойства Экземпляров NativeError

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

Ошибки16 Ошибки

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

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

Некорректное использование return, break и continue.Использование свойства eval каким-либо другим способом, кроме прямого вызова.Ошибки в литералах регулярных выражений.Попытки вызвать свойство PutValue для значения, не являющегося ссылкой(например, выполнение присваивания 3=4).

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

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

Реализация может расширять синтаксис программы и регулярных выражений. Чтобысделать это возможным, всем операциям (такие как вызов eval, использованиелитерала регулярного выражения или вызов функции Function или конструктораRegExp), которые могут бросать исключение SyntaxError, разрешается вести себянекоторым определённым реализацией способом, вместо того, чтобы бросатьисключение SyntaxError, когда им встречается определённое реализациейрасширение синтаксиса программы и регулярных выражений.Реализация может вводить дополнительные типы, значения, объекты, свойства ифункции, помимо определённых в данной спецификации. Эти добавления могутввести для некоторых конструкций языка (таких, как обращение к переменной вглобальной области видимости) некоторое зависящее от реализации поведение,вместо бросания ошибки (такой как ReferenceError).От реализации не требуется обнаруживать EvalError. Если она выбирает необнаруживать EvalError, реализация должна позволить непрямое использование

Page 229: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

eval и/или присвоения свойству eval.Реализация может определить для методов toFixed, toExponential и toPrecisionповедение, отличающееся от бросания RangeError, для тех случаев, когда значениеаргумента fractionDigits или precision находится вне указанного диапазона.

Приложение AПриложение A

(информативное)Описание грамматикA.1 Лексическая грамматика

См. раздел 6ИсходныйСимвол ::

любой символ Unicode

См. раздел 7ВходнойЭлементДеления ::

Пробел КонецСтроки Комментарий Токен ЗнакДеления

См. раздел 7ВходнойЭлементРегВыр ::

Пробел КонецСтроки Комментарий Токен ЛитералРегулярногоВыражения

См. 7.2Пробел ::

<TAB> <VT> <FF> <SP> <NBSP> <USP>

См. 7.3КонецСтроки ::

<LF> <CR> <LS> <PS>

См. 7.4Комментарий ::

МногострочныйКомментарий

Page 230: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ОднострочныйКомментарий

См. 7.4МногострочныйКомментарий ::

/* СимволыМногострочногоКомментарияопц */

См. 7.4СимволыМногострочногоКомментария ::

МногострочныйСимвНеЗвёздочка СимволыМногострочногоКомментарияопц * СимволыКомментарияПослеЗвёздочкиопц

См. 7.4СимволыКомментарияПослеЗвёздочки ::

МногострочныйСимвНеСлэшИлиЗвёздочка СимволыМногострочногоКомментарияопц * СимволыКомментарияПослеЗвёздочкиопц

См. 7.4МногострочныйСимвНеЗвёздочка ::

ИсходныйСимвол но не звёздочка *

См. 7.4МногострочныйСимвНеСлэшИлиЗвёздочка ::

ИсходныйСимвол но не прямой слэш / или звёздочка *

См. 7.4ОднострочныйКомментарий ::

// СимволыОднострочногоКомментарияопц

См. 7.4СимволыОднострочногоКомментария ::

СимволОднострочногоКомментария СимволыОднострочногоКомментарияопц

См. 7.4СимволОднострочногоКомментария ::

ИсходныйСимвол но не КонецСтроки

См. 7.5Токен ::

ЗарезервированноеСлово Идентификатор ЗнакПрепинанияЧисловойЛитерал СтроковойЛитерал

См. 7.5.1ЗарезервированноеСлово ::

КлючевоеСловоЗарезервированноеНаБудущееСловоЛитералNull БулевскийЛитерал

Page 231: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. 7.5.2КлючевоеСлово :: одно из

break else new var case finally return void catch for switch while continue functionthis with default if throw delete in try do instanceof typeof

См. 7.5.3ЗарезервированноеНаБудущееСлово :: одно из

abstract enum int short boolean export interface static byte extends long super charfinal native synchronized class float package throws const goto private transientdebugger implements protected volatile double import public

См. 7.6Идентификатор ::

ИмяИдентификатора но не ЗарезервированноеСлово

См. 7.6ИмяИдентификатора ::

НачалоИдентификатора НачалоИдентификатора ЧастьИдентификатора

См. 7.6НачалоИдентификатора ::

БукваЮникода $ _

\ ЮникоднаяEscapeПоследовательность

См. 7.6ЧастьИдентификатора ::

НачалоИдентификатора КомбинирующийЗнакЮникода ЦифраЮникода СоединяющаяПунктуацияЮникода \ ЮникоднаяEscapeПоследовательность

См. 7.6БукваЮникода

любой символ из следующих категорий Юникода: "Прописная буква (Lu)", "Строчнаябуква (Ll)", "Заглавная буква (Lt)", "Буква-модификатор (Lm)", "Другая бугва (Lo)", или"Буква-число (Nl)".

См. 7.6КомбинирующийЗнакЮникода

любой символ из следующих категорий Юникода: "Не-пробельный знак (Mn)" или"Комбинирующий пробельный знак (Mc)"

См. 7.6ЦифраЮникода

любой символ из категории Юникода "Десятичное число (Nd)"

См. 7.6

Page 232: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

СоединяющаяПунктуацияЮникодалюбой символ из категории Юникода "Соединяющая пунктуация (Pc)"

См. 7.6ШестнадцатеричнаяЦифра :: одна из

0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

См. 7.7ЗнакПрепинания :: один из

{ } ( ) [ ] . ; , < > <= >= == != === !== + - * % ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *= %= <<= >>= >>>= &= |= ^=

См. 7.7ЗнакДеления :: один их

/ /=

См. 7.8Литерал ::

ЛитералNull БулевскийЛитерал ЧисловойЛитерал СтроковойЛитерал

См. 7.8.1ЛитералNull ::

null

См. 7.8.2БулевскийЛитерал ::

true false

См. 7.8.3ЧисленныйЛитерал ::

ДесятичныйЛитерал ШестнадцатеричныйЦелыйЛитерал

См. 7.8.3ДесятичныйЛитерал ::

ДесятичныйЦелыйЛитерал . ДесятичныеЦифрыопц ЭкспоненциальнаяЧастьопц . ДесятичныеЦифры ЭкспоненциальнаяЧастьопц ДесятичныйЦелыйЛитерал ЭкспоненциальнаяЧастьопц

См. 7.8.3ДесятичныйЦелыйЛитерал ::

Page 233: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

0 НенулеваяЦифра ДесятичныеЦифрыопц

См. 7.8.3ДесятичныеЦифры ::

ДесятичнаяЦифра ДесятичныеЦифры ДесятичнаяЦифра

См. 7.8.3ДесятичнаяЦифра :: одна из

0 1 2 3 4 5 6 7 8 9

См. 7.8.3ПризнакЭкспоЗаписи :: один из

e E

См. 7.8.3ЗнаковоеЦелое ::

ДесятичныеЦифры + ДесятичныеЦифры - ДесятичныеЦифры

См. 7.8.3ШестнадцатеричныйЦелыйЛитерал ::

ШестнадцатеричнаяЦифра0x ШестнадцатеричнаяЦифра 0X ШестнадцатеричнаяЦифраШестнадцатеричныйЦелыйЛитерал ШестнадцатеричнаяЦифра

См. 7.8.4СтроковойЛитерал ::

" СимволыДвойнойСтрокиопц " ' СимволыОдинарнойСтрокиопц '

См. 7.8.4СимволыДвойнойСтроки ::

СимволДвойнойСтроки СимволыДвойнойСтрокиопц

См. 7.8.4СимволыОдинарнойСтроки ::

СимволОдинарнойСтроки СимволыОдинарнойСтрокиопц

См. 7.8.4СимволДвойнойСтроки ::

ИсходныйСимвол но не двойная-кавычка " или обратный-слэш \или КонецСтроки \ EscapeПоследовательность

См. 7.8.4SingleStringCharacter ::

ИсходныйСимвол но не одиночная-кавычка ' или обратный-слэш \илиКонецСтроки \ EscapeПоследовательность

Page 234: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. 7.8.4EscapeПоследовательность ::

СимвольнаяEscapeПоследовательность 0 [предпросмотр ДесятичнаяЦифра] ШестнадцатеричнаяEscapeПоследовательность ЮникоднаяEscapeПоследовательность

См. 7.8.4СимвольнаяEscapeПоследовательность ::

ОдиночныйEscapeСимвол НеEscapeСимвол

См. 7.8.4ОдиночныйEscapeСимвол :: один из

' " \ b f n r t v

См. 7.8.4EscapeСимвол ::

ОдиночныйEscapeСимвол ДесятичнаяЦифра x u

См. 7.8.4ШестнадцатеричнаяEscapeПоследовательность ::

x ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра

См. 7.8.4ЮникоднаяEscapeПоследовательность ::

u ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифраШестнадцатеричнаяЦифра

См. 7.8.5ЛитералРегулярногоВыражения ::

/ ТелоРегулярногоВыражения / ФлагиРегулярногоВыражения

См. 7.8.5ТелоРегулярногоВыражения ::

ПервыйСимволРегулярногоВыражения СимволыРегулярногоВыражения

См. 7.8.5СимволыРегулярногоВыражения ::

[пусто] СимволыРегулярногоВыражения СимволРегулярногоВыражения

См. 7.8.5ПервыйСимволРегулярногоВыражения ::

НеОкончание но не * или \ или / ПоследовательностьОбрСлэш

См. 7.8.5СимволРегулярногоВыражения ::

Page 235: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

НеОкончание но не\ или / ПоследовательностьОбрСлэш

См. 7.8.5ПоследовательностьОбрСлэш ::

\ НеОкончание

См. 7.8.5НеОкончание ::

ИсходныйСимвол но не КонецСтроки

См. 7.8.5ФлагиРегулярногоВыражения ::

[пусто] ФлагиРегулярногоВыражения ЧастьИдентификатора

A.2 Численные преобразования

См. 9.3.1СтроковойЧисленныйЛитерал :::

СтрПробеловопц СтрПробеловопц СтрЧисленныйЛитерал СтрПробеловопц

См. 9.3.1СтрПробелов :::

СтрСимвПробела СтрПробеловопц

См. 9.3.1СтрСимвПробела :::

<TAB> <SP> <NBSP> <FF> <VT> <CR> <LF> <LS> <PS> <USP>

См. 9.3.1СтрЧисленныйЛитерал :::

СтрДесятичныйЛитералШестнадцатеричныйЦелыйЛитерал

См. 9.3.1СтрДесятичныйЛитерал :::

СтрБеззнаковыйДесятичныйЛитерал + СтрБеззнаковыйДесятичныйЛитерал - СтрБеззнаковыйДесятичныйЛитерал

См. 9.3.1

Page 236: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

СтрБеззнаковыйДесятичныйЛитерал :::Infinity ДесятичныеЦифры . ДесятичныеЦифрыопц ЭкспоненциальнаяЧастьопц . ДесятичныеЦифры ЭкспоненциальнаяЧастьопц ДесятичныеЦифры ЭкспоненциальнаяЧастьопц

См. 9.3.1ДесятичныеЦифры :::

ДесятичнаяЦифра ДесятичныеЦифры ДесятичнаяЦифра

См. 9.3.1ДесятичнаяЦифра ::: одна из

0 1 2 3 4 5 6 7 8 9

См. 9.3.1ЭкспоненциальнаяЧасть :::

ПризнакЭкспоЗаписи ЗнаковоеЦелое

См. 9.3.1ПризнакЭкспоЗаписи ::: один из

e E

См. 9.3.1ЗнаковоеЦелое :::

ДесятичныеЦифры + ДесятичныеЦифры - ДесятичныеЦифры

См. 9.3.1ШестнадцатеричныйЦелыйЛитерал :::

ШестнадцатеричнаяЦифра0x ШестнадцатеричнаяЦифра 0X ШестнадцатеричнаяЦифраШестнадцатеричныйЦелыйЛитерал ШестнадцатеричнаяЦифра

См. 9.3.1ШестнадцатеричнаяЦифра ::: одна из

0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

A.3 Выражения

См. 11.1ПервичноеВыражение :

this ИдентификаторЛитералЛитералМассива ЛитералОбъекта ( Выражение )

См. 11.1.4ЛитералМассива :

Page 237: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

[ Пропускопц ] [ СписокЭлементов ] [ СписокЭлементов , Пропускопц ]

См. 11.1.4СписокЭлементов :

Пропускопц ВыражениеПрисваиванияСписокЭлементов , Пропускопц ВыражениеПрисваивания

См. 11.1.4Пропуск :

, Пропуск ,

См. 11.1.5ЛитералОбъекта :

{} { СписокИмёнСвойствИЗначений }

См. 11.1.5СписокИмёнСвойствИЗначений :

ИмяСвойства : ВыражениеПрисваивания СписокИмёнСвойствИЗначений , ИмяСвойства : ВыражениеПрисваивания

См. 11.1.5ИмяСвойства :

Идентификатор СтроковойЛитерал ЧисленныйЛитерал

См. 11.2ВыражениеЭлемента :

ПервичноеВыражение ВыражениеФункции ВыражениеЭлемента [ Выражение ] ВыражениеЭлемента . Идентификатор new ВыражениеЭлемента Аргументы

См. 11.2ВыражениеNew :

ВыражениеЭлемента new ВыражениеNew

См. 11.2ВыражениеCall :

ВыражениеЭлемента АргументыВыражениеCall АргументыВыражениеCall [ Выражение ] ВыражениеCall . Идентификатор

См. 11.2

Page 238: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Аргументы :() ( СписокАргументов )

См. 11.2СписокАргументов :

ВыражениеПрисваивания СписокАргументов , ВыражениеПрисваивания

См. 11.2ЛевостороннееВыражение :

ВыражениеNew ВыражениеCall

См. 11.3ПостфиксноеВыражение :

ЛевостороннееВыражение ЛевостороннееВыражение [здесь нет КонцаСтроки] ++ ЛевостороннееВыражение [здесь нет КонцаСтроки] --

См. 11.4УнарноеВыражение :

ПостфиксноеВыражение delete УнарноеВыражение void УнарноеВыражение typeof УнарноеВыражение ++ УнарноеВыражение -- УнарноеВыражение + УнарноеВыражение - УнарноеВыражение ~ УнарноеВыражение ! УнарноеВыражение

См. 11.5МультипликативноеВыражение :

УнарноеВыражениеМультипликативноеВыражение * УнарноеВыражение МультипликативноеВыражение / УнарноеВыражение МультипликативноеВыражение % УнарноеВыражение

См. 11.6АддитивноеВыражение :

МультипликативноеВыражение АддитивноеВыражение + МультипликативноеВыражение АддитивноеВыражение - МультипликативноеВыражение

См. 11.7ВыражениеСдвига :

АддитивноеВыражение ВыражениеСдвига << ВыражениеСдвига ВыражениеСдвига >> АддитивноеВыражение ВыражениеСдвига >>> АддитивноеВыражение

Page 239: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. 11.8ВыражениеОтношения :

ВыражениеСдвига ВыражениеОтношения < ВыражениеСдвига ВыражениеОтношения > ВыражениеСдвига ВыражениеОтношения <= ВыражениеСдвига ВыражениеОтношения >= ВыражениеСдвига ВыражениеОтношения instanceof ВыражениеСдвига ВыражениеОтношения in ВыражениеСдвига

См. 11.8ВыражениеОтношенияБезIn :

ВыражениеСдвига ВыражениеОтношенияБезIn < ВыражениеСдвига ВыражениеОтношенияБезIn > ВыражениеСдвига ВыражениеОтношенияБезIn <= ВыражениеСдвига ВыражениеОтношенияБезIn >= ВыражениеСдвига ВыражениеОтношенияБезIn instanceof ВыражениеСдвига

См. 11.9ВыражениеРавенства :

ВыражениеОтношения ВыражениеРавенства == ВыражениеОтношения ВыражениеРавенства != ВыражениеОтношения ВыражениеРавенства === ВыражениеОтношения ВыражениеРавенства !== ВыражениеОтношения

См. 11.9ВыражениеРавенстваБезIn :

ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn == ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn != ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn === ВыражениеОтношенияБезIn ВыражениеРавенстваБезIn !== ВыражениеОтношенияБезIn

См. 11.10ВыражениеПобитовогоИ :

ВыражениеРавенства ВыражениеПобитовогоИ & ВыражениеРавенства

См. 11.10ВыражениеПобитовогоИБезIn :

ВыражениеРавенстваБезIn ВыражениеПобитовогоИБезIn & ВыражениеРавенстваБезIn

См. 11.10ВыражениеПобитовогоИскИЛИ :

ВыражениеПобитовогоИ ВыражениеПобитовогоИскИЛИ ^ ВыражениеПобитовогоИ

См. 11.10

Page 240: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ВыражениеПобитовогоИскИЛИБезIn :ВыражениеПобитовогоИБезIn ВыражениеПобитовогоИскИЛИБезIn ^ ВыражениеПобитовогоИБезIn

См. 11.10ВыражениеПобитовогоИЛИ :

ВыражениеПобитовогоИскИЛИ ВыражениеПобитовогоИЛИ | ВыражениеПобитовогоИскИЛИ

См. 11.10ВыражениеПобитовогоИЛИБезIn :

ВыражениеПобитовогоИскИЛИБезIn ВыражениеПобитовогоИЛИБезIn | ВыражениеПобитовогоИскИЛИБезIn

См. 11.11ВыражениеЛогическогоИ :

ВыражениеПобитовогоИЛИ ВыражениеЛогическогоИ && ВыражениеПобитовогоИЛИ

См. 11.11ВыражениеЛогическогоИБезIn :

ВыражениеПобитовогоИЛИБезIn ВыражениеЛогическогоИБезIn && ВыражениеПобитовогоИЛИБезIn

См. 11.11ВыражениеЛогическогоИЛИ :

ВыражениеЛогическогоИ ВыражениеЛогическогоИЛИ || ВыражениеЛогическогоИ

См. 11.11ВыражениеЛогическогоИЛИБезIn :

ВыражениеЛогическогоИБезIn ВыражениеЛогическогоИЛИБезIn || ВыражениеЛогическогоИБезIn

См. 11.12УсловноеВыражение :

ВыражениеЛогическогоИЛИ ВыражениеЛогическогоИЛИ ? ВыражениеПрисваивания : ВыражениеПрисваивания

См. 11.12УсловноеВыражениеБезIn :

ВыражениеЛогическогоИЛИБезIn ВыражениеЛогическогоИЛИБезIn ? ВыражениеПрисваиванияБезIn :ВыражениеПрисваиванияБезIn

См. 11.13ВыражениеПрисваивания :

УсловноеВыражение ЛевостороннееВыражение ОператорПрисваивания ВыражениеПрисваивания

См. 11.13ВыражениеПрисваиванияБезIn :

Page 241: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

УсловноеВыражениеБезIn ЛевостороннееВыражение ОператорПрисваивания ВыражениеПрисваиванияБезIn

См. 11.13ОператорПрисваивания : один из

= *= /= %= += -= <<= >>= >>>= &= ^= |=

См. 11.14Выражение :

ВыражениеПрисваивания Выражение , ВыражениеПрисваивания

См. 11.14ВыражениеБезIn :

ВыражениеПрисваиванияБезIn ВыражениеБезIn , ВыражениеПрисваиванияБезIn

A.4 Инструкции

См. раздел 12Инструкция :

Блок ИнструкцияПеременной ПустаяИнструкция ИнструкцияВыражение ИнструкцияIfИнструкцияИтерации ИнструкцияContinue ИнструкцияBreak ИнструкцияReturn ИнструкцияWith ИнструкцияСМеткой ИнструкцияSwitch ИнструкцияThrow ИнструкцияTry

См. 12.1Блок :

{ СписокИнструкцийопц }

См. 12.1СписокИнструкций :

Инструкция СписокИнструкций Инструкция

См. 12.2ИнструкцияПеременной :

var СписокОбъявленияПеременных ;

См. 12.2СписокОбъявленияПеременных :

ОбъявлениеПеременной

Page 242: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

СписокОбъявленияПеременных , ОбъявлениеПеременной

См. 12.2СписокОбъявленияПеременныхБезIn :

ОбъявлениеПеременнойБезIn СписокОбъявленияПеременныхБезIn , ОбъявлениеПеременнойБезIn

См. 12.2ОбъявлениеПеременной :

Идентификатор Инициализаторопц

См. 12.2ОбъявлениеПеременнойБезIn :

Идентификатор ИнициализаторБезInопц

См. 12.2Инициализатор :

= ВыражениеПрисваивания

См. 12.2ИнициализаторБезIn :

= ВыражениеПрисваиванияБезIn

См. 12.3ПустаяИнструкция :

;

См. 12.4ИнструкцияВыражение :

[предпросмотр {{, function}] Выражение ;

См. 12.5ИнструкцияIf :

if ( Выражение ) Инструкция else Инструкция if ( Выражение ) Инструкция

См. 12.6ИнструкцияИтерации :

do Инструкция while ( Выражение ); while ( Выражение ) Инструкция for (ВыражениеБезInопц; Выражениеопц ; Выражениеопц ) Инструкция for (var СписокОбъявленияПеременныхБезIn; Выражениеопц ; Выражениеопц )Инструкция for ( ЛевостороннееВыражение in Выражение ) Инструкция for (var ОбъявлениеПеременнойБезIn in Выражение ) Инструкция

См. 12.7ИнструкцияContinue :

continue [здесь нет КонцаСтроки] Идентификаторопц ;

См. 12.8

Page 243: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

ИнструкцияBreak :break [здесь нет КонцаСтроки] Идентификаторопц ;

См. 12.9ИнструкцияReturn :

return [здесь нет КонцаСтроки] Выражениеопц ;

См. 12.10ИнструкцияWith :

with ( Выражение ) Инструкция

См. 12.11ИнструкцияSwitch :

switch ( Выражение ) БлокCase

См. 12.11БлокCase :

{ ВетвиCaseопц } { ВетвиCaseопц ВетвьПоУмолчанию ВетвиCaseопц }

См. 12.11ВетвиCase :

ВетвьCase ВетвиCase ВетвьCase

См. 12.11ВетвьCase :

case Выражение : СписокИнструкцийопц

См. 12.11ВетвьПоУмолчанию :

default : СписокИнструкцийопц

См. 12.12ИнструкцияСМеткой :

Идентификатор : Инструкция

См. 12.13ThrowStatement :

throw [здесь нет КонцаСтроки] Выражение ;

См. 12.14ИнструкцияTry :

try Блок Catch try Блок Finally try Блок Catch Finally

См. 12.14Catch :

catch (Идентификатор ) Блок

Page 244: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. 12.14Finally :

finally Блок

A.5 Функции и программы

См. раздел 13ОбъявлениеФункции :

function Идентификатор ( СписокФормальныхАргументовопц ){ ТелоФункции }

См. раздел 13ВыражениеФункции :

function Идентификаторопц ( СписокФормальныхАргументовопц ){ ТелоФункции }

См. раздел 13СписокФормальныхАргументов :

Идентификатор СписокФормальныхАргументов , Идентификатор

См. раздел 13ТелоФункции :

ЭлементыИсходногоКода

См. раздел 14Программа :

ЭлементыИсходногоКода

См. раздел 14ЭлементыИсходногоКода :

ЭлементИсходногоКода ЭлементыИсходногоКода ЭлементИсходногоКода

См. раздел 14ЭлементИсходногоКода :

Инструкция ОбъявлениеФункции

A.6 Классы символов URI

См. 15.1.3uri :::

uriСимволыопц

См. 15.1.3символыUri :::

символUri символыUriопц

См. 15.1.3символUri :::

uriЗарезервированныйuriНеэкранированный uriЭкранированный

Page 245: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. 15.1.3uriЗарезервированный ::: один из

; / ? : @ & = + $ ,

См. 15.1.3uriНеэкранированный :::

uriБукваДесятичнаяЦифра uriЗнак

См. 15.1.3uriЭкранированный :::

% ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра

См. 15.1.3uriБуква ::: одна из

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

См. 15.1.3uriЗнак ::: один из

- _ . ! ~ * ' ( )

A.7 Регулярные выражения

См. 15.10.1Шаблон ::

Дизъюнкция

См. 15.10.1Дизъюнкция ::

Альтернатива Альтернатива | Дизъюнкция

См. 15.10.1Альтернатива ::

[пусто] Альтернатива Элемент

См. 15.10.1Элемент ::

Проверка Атом Атом ПризнакКоличества

См. 15.10.1Проверка ::

^ $ \ b \ B

Page 246: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. 15.10.1ПризнакКоличества ::

ПрефиксПризнакаКоличества ПрефиксПризнакаКоличества ?

См. 15.10.1ПрефиксПризнакаКоличества ::

* + ? { ДесятичныеЦифры } { ДесятичныеЦифры ,} { ДесятичныеЦифры , ДесятичныеЦифры }

См. 15.10.1Атом ::

СимволШаблона .

\ EscapeАтом КлассСимволов ( Дизъюнкция ) (?: Дизъюнкция ) (?= Дизъюнкция ) (?! Дизъюнкция )

См. 15.10.1СимволШаблона ::ИсходныйСимвол но не один из:

^ $ \ . * + ? ( ) [ ] { } |

См. 15.10.1EscapeАтом ::

ДесятичнаяEscape СимвольнаяEscapeEscapeКлассаСимвола

См. 15.10.1СимвольнаяEscape ::

УправляющаяEscape c УправляющийСимвол ШестнадцатеричнаяEscapeПоследовательность ЮникоднаяEscapeПоследовательность EscapeИдентификатора

См. 15.10.1УправляющаяEscape :: один из

f n r t v

См. 15.10.1УправляющийСимвол :: один из

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Page 247: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

См. 15.10.1EscapeИдентификатора ::

ИсходныйСимвол но не ЧастьИдентификатора

См. 15.10.1ДесятичнаяEscape ::

ДесятичныйЦелыйЛитерал [предпросмотр ДесятичнаяЦифра]

См. 15.10.1КлассСимволов ::

[ [предпросмотр {^}] ДиапазоныКласса ] [^ ДиапазоныКласса ]

См. 15.10.1ДиапазоныКласса ::

[пусто] НепустыеДиапазоныКласса

См. 15.10.1НепустыеДиапазоныКласса ::

АтомКласса АтомКласса НепустыеДиапазоныКлассаБезТире АтомКласса - АтомКласса ДиапазоныКласса

См. 15.10.1НепустыеДиапазоныКлассаБезТире ::

АтомКласса АтомКлассаБезТире НепустыеДиапазоныКлассаБезТире АтомКлассаБезТире - АтомКласса ДиапазоныКласса

См. 15.10.1АтомКласса ::

- АтомКлассаБезТире

См. 15.10.1АтомКлассаБезТире ::

ИсходныйСимвол но не один из \ ] - \ EscapeКласса

См. 15.10.1EscapeКласса ::

ДесятичнаяEscape b СимвольнаяEscape EscapeКлассаСимвола

Приложение BПриложение B

Page 248: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

(информативное)СовместимостьB.1 Дополнительный синтаксис

Предыдущие версии ECMAScript включали дополнительный синтаксис и семантику дляуказания восьмеричных литералов и восьмеричных escape-последовательностей. Онибыли удалены из данной редакции ECMAScript. Это ненормативное приложениепредставляет единый синтаксис и семантику для восьмеричных литералов ивосьмеричных escape-последовательностей для совместимости со старыми программамина ECMAScript.

B.1.1 Численные литералы

Синтаксис и семантика раздела 7.8.3 могут быть расширены согласно следующемуописанию:

Синтаксис

ЧисленныйЛитерал ::ДесятичныйЛитерал ШестнадцатеричныйЦелыйЛитерал ВосьмеричныйЦелыйЛитерал

ВосьмеричнаяЦифра :: одна из0 1 2 3 4 5 6 7

ВосьмеричныйЦелыйЛитерал ::0 ВосьмеричнаяЦифра ВосьмеричныйЦелыйЛитерал ВосьмеричнаяЦифра

Семантика

МЗ ЧисловогоЛитерала :: ВосьмеричногоЦелогоЛитерала равняется МЗВосьмеричногоЦелогоЛитерала.МЗ ВосьмеричнойЦифры :: 0 равно 0.МЗ ВосьмеричнойЦифры :: 1 равно 1.МЗ ВосьмеричнойЦифры :: 2 равно 2.МЗ ВосьмеричнойЦифры :: 3 равно 3.МЗ ВосьмеричнойЦифры :: 4 равно 4.МЗ ВосьмеричнойЦифры :: 5 равно 5.МЗ ВосьмеричнойЦифры :: 6 равно 6.МЗ ВосьмеричнойЦифры :: 7 равно 7.МЗ ВосьмеричногоЦелогоЛитерала :: 0 ВосьмеричнойЦифры равно МЗВосьмеричнойЦифры.МЗ ВосьмеричногоЦелогоЛитерала :: ВосьмеричногоЦелогоЛитералаВосьмеричнойЦифры равно сумме (МЗ ВосьмеричногоЦелогоЛитерала умноженнойна 8) и МЗ ВосьмеричнойЦифры.

B.1.2 Строковые литералы

Синтаксис и семантика раздела 7.8.4 могут быть расширены согласно следующемуописанию:

Page 249: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Синтаксис

EscapeПоследовательность ::СимвольнаяEscapeПоследовательность ВосьмеричнаяEscapeПоследовательность ШестнадцатеричнаяEscapeПоследовательность ЮникоднаяEscapeПоследовательность

ВосьмеричнаяEscapeПоследовательность ::ВосьмеричнаяЦифра [предпросмотр ДесятичнаяЦифра] ОтНуляДоТрёх ВосьмеричнаяЦифра [предпросмотр ДесятичнаяЦифра] ОтЧетырёхДоСеми ВосьмеричнаяЦифра ОтНуляДоТрёх ВосьмеричнаяЦифра ВосьмеричнаяЦифра

ОтНуляДоТрёх :: одна из0 1 2 3

ОтЧетырёхДоСеми :: одна из4 5 6 7

Семантика

СиЗ EscapeПоследовательности :: ВосьмеричнойEscapeПоследовательности равноСиЗ ВосьмеричнойEscapeПоследовательности.СиЗ ВосьмеричнойEscapeПоследовательности :: ВосьмеричнойЦифры [предпросмотр ДесятичнойЦифре] равно символу, код которого равняется МЗ

ВосьмеричнойЦифры.СиЗ ВосьмеричнойEscapeПоследовательности :: ОтНуляДоТрёх ВосьмеричнойЦифры[предпросмотр ДесятичнойЦифре] равно символу, код которого равняется сумме(МЗ ОтНуляДоТрёх, умноженного на 8) и МЗ ВосьмеричнойЦифры.СиЗ ВосьмеричнойEscapeПоследовательности :: ОтЧетырёхДоСемиВосьмеричнойЦифры равно символу, код которого равняется сумме (МЗОтЧетырёхДоСеми, умноженного на 8) и МЗ ВосьмеричнойЦифры.СиЗ ВосьмеричнойEscapeПоследовательности :: ОтНуляДоТрёх ВосьмеричнойЦифрыВосьмеричнойЦифры равно символу, код которого равняется сумме (МЗОтНуляДоТрёх, умноженного на 64 (т.е., 82 ) ), (МЗ первой ВосьмеричнойЦифры,умноженной на 8) и МЗ второй ВосьмеричнойЦифры.МЗ ОтНуляДоТрёх :: 0 равно 0.МЗ ОтНуляДоТрёх :: 1 равно 1.МЗ ОтНуляДоТрёх :: 2 равно 2.МЗ ОтНуляДоТрёх :: 3 равно 3.МЗ ОтЧетырёхДоСеми :: 4 равно 4.МЗ ОтЧетырёхДоСеми :: 5 равно 5.МЗ ОтЧетырёхДоСеми :: 6 равно 6.МЗ ОтЧетырёхДоСеми :: 7 равно 7.

B.2 Дополнительные свойства

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

Page 250: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

B.2.1 escape (string)

Функция escape является свойством глобального объекта. Она вычисляет новую версиюстрокового значения, для которой некоторые символы были заменены нашестнадцатеричные escape-последовательности.

Для таких заменяемых символов, коды которых меньше или равны 0xFF, используетсядвухциферная escape-последовательность вида %xx. Для таких заменяемых символов,коды которых больше 0xFF, используется четырёхциферная escape-последовательностьвида %uxxxx.

Когда функция escape вызывается с единственным аргументом string, предпринимаютсяследующие шаги:

1. Вызвать ToString(string).

2. Подсчитать количество символов в Результате(1).

3. Пусть R равно пустой строке.

4. Пусть k равно 0.

5. Если k равняется Результату(2), вернуть R.

6. Получить символ (представленный как 16-битное беззнаковое целое) на позиции k встроке Результат(1).

7. Если Результат(6) является одним из 69 непробельных символов"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./ " - переход на шаг13.

8. Если Результат(6) меньше 256 - переход на шаг 11.

9. Пусть S - строка, состоящая из шести символов "%uwxyz", где wxyz - четырешестнадцатиричные цифры, кодирующие значение Результата(6).

10. Переход на шаг 14.

11. Пусть S равно строке, содержащей три символа "%xy", где xy - двешестнадцатеричные цифры, кодирующие значение Результата(6).

12. Переход на шаг 14.

13. Пусть S - строка, содержащая единственный символ Результат(6).

14. Пусть R - новое строковое значение, получаемое конкатенацией предыдущегозначения R и S.

15. Увеличить k на 1. 16. Переход на шаг 5.

ЗАМЕЧАНИЕЭто кодирование частично основан на кодировании, описанном в RFC1738, но весьпроцесс кодирования в данном стандарте описан выше без ссылки на RFC1738.

Page 251: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

B.2.2 unescape (string)

Функция unescape является свойством глобального объекта. Она вычисляет новую версиюстрокового значения, в которой escape-последовательности такого вида, какого моглибы быть введены функцией escape, заменяются на символы, которые они представляют.

Когда функция unescape вызывается с единственным аргументом string, предпринимаютсяследующие шаги:

1. Вызвать ToString(string).

2. Подсчитать количество символов в Результате(1).

3. Пусть R равно пустой строке.

4. Пусть k равно 0.

5. Если k равняется Результату(2), вернуть R.

6. Пусть c - символ на позиции k в строке Результат(1).

7. Если c не % - переход на шаг 18.

8. Если k больше, чем Результат(2)-6 - переход на шаг 14.

9. Если символ на позиции k+1 в Результате(1) не равен u, - переход на шаг 14.

10. Если четыре символа на позициях k+2, k+3, k+4 и k+5 в Результате(1) не являютсяшестнадцатеричными цифрами - переход на шаг 14.

11. Пусть c - символ, значение которого является целым, представленным четырьмяшестнадцатеричными цифрами на позициях k+2, k+3, k+4 и k+5 в строке Результат(1).

12. Увеличить k на 1.

13. Переход на шаг 18.

14. Если k больше, чем Результат(2)-3 - переход на шаг 18.

15. Если два символа на позициях k+1 и k+2 в строке Результат(1) не являются обашестнадцатеричными цифрами - переход на шаг 18.

16. Пусть c - символ, код которого представляется двумя нулями и двумяшестнадцатеричными цифрами на позициях k+1 и k+2 в строке Результат(1).

17. Увеличить k на 2.

18. Пусть R - новое строковое значение, получаемое конкатенацией предыдущегозначения R и c.

19. Увеличить k на 1.

20. Переход на шаг 5.

Page 252: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

B.2.3 String.prototype.substr (start, length)

Метод substr принимает два аргумента start и length, преобразовывает данный объект кстроке и возвращает её подстроку, начинающуюся с символа на позиции start ивключающую length символов (или продолжающуюся до конца строки, если length равноundefined). Если start отрицательно, вместо него используется значение (sourceLength+start), где sourceLength равно длине строки. Результатом является строковое значение(не объект String). Предпринимаются следующие шаги:

1. Вызвать ToString, передав ему значение this в качестве аргумента.

2. Вызвать ToInteger(start).

3. Если length равно undefined, использовать +∞ ; иначе вызвать ToInteger(length).

4. Подсчитать количество символов в Результате(1).

5. Если Результат(2) положителен или равен нулю - использовать Результат(2). Иначеиспользовать max(Результат(4)+ Результат(2), 0).

6. Вычислить min(max(Результат(3), 0), Результат(4)- Результат(5)).

7. Если Результат(6) <= 0 - вернуть пустую строку "".

8. Вернуть строку, содержащую Результат(6) последовательных символов Результата(1),начинающихся с символа на позиции Результат(5).

Свойство length метода substr равно 2.

ЗАМЕЧАНИЕФункция substr специально сделана не привязанной к типу. Она не требует, чтобы еёзначение this было объектом типа String. Таким образом, она может быть переданадругим типам объектов для использования в качестве метода.

B.2.4 Date.prototype.getYear()

ЗАМЕЧАНИЕВ большинстве случаев предпочтительнее использовать метод getFullYear, поскольку онпозволяет избежать "проблемы года 2000".

Когда метод getYear вызывается без аргументов, предпринимаются следующие шаги:

1. Пусть t - данное значение времени.

2. Если t равно NaN - вернуть NaN.

3. Вернуть ГодДляВремени(МестноеВремя(t))-1900.

B.2.5 Date.prototype.setYear(year)

ЗАМЕЧАНИЕВ большинстве случаев предпочтительнее использовать метод setFullYear, поскольку онпозволяет избежать "проблемы года 2000".

Page 253: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Когда метод setYear вызывается с единственным аргументом year, предпринимаютсяследующие шаги:

1. Пусть t - результат выражения МестноеВремя(данное значение времени). Но еслиданное значение времени равно NaN, взять в качестве t +0.

2. Вызвать ToNumber(year).

3. Если Результат(2) равен NaN, установить значение свойства [[Value]] значения thisравным NaN и вернуть NaN.

4. Если Результат(2) не равен NaN и 0 <= ToInteger(Результат(2)) <= 99, то Результат(4)равен ToInteger(Результат(2)) + 1900. Иначе Результат(4) равен Результату(2).

5. Вычислить СоставитьДень(Результат(4), МесяцДляВремени(t), ДатаДляВремени(t)).

6. Вычислить UTC(СоставитьДату(Результат(5), ВремяДня(t))).

7. Установить свойство [[Value]] значения this равным ОграничитьВремя(Результат(6)).

8. Вернуть значение свойства [[Value]] значения this.

B.2.6 Date.prototype.toGMTString()

ЗАМЕЧАНИЕПредпочтительнее использовать свойство toUTCString. Свойство toGMTString введеноисключительно для совместимости со старым кодом. В новом коде на ECMAScriptрекомендуется использовать свойство toUTCString.

Объект Function, являющийся начальным значением свойства Date.prototype.toGMTStringявляется тем же объектом Function, что и Date.prototype.toUTCString.

Глоссарий англоязычных терминовЭтот список содержит основные англоязычные термины и их перевод, принятый в стандартеECMAScript.InputElementDiv ВходнойЭлементДеленияInputElementRegExp ВходнойЭлементРегВырMultiLineComment МногострочныйКомментарийRegExp РегВырPattern ШаблонProgram ПрограммаExpression ВыражениеStatement ИнструкцияWithStatement ИнструкцияWithAssignmentExpression ВыражениеПрисваиванияArgumentList СписокАргументовIdentifier Идентификатор Initialiser ИнициализаторExpressionNoIn ВыражениеБезInDecimalDigit ДесятичнаяЦифра DecimalDigits ДесятичныеЦифрыLookaheadExample ПримерПредпросмотраLineTerminator КонецСтрокиNonZeroDigit НенулеваяЦифраIdentifierName ИмяИдентификатораSourceCharacter ИсходныйСимволWhiteSpace ПробелComment Комментарий

Page 254: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

SingleLineComment ОднострочныйКомментарийMultiLineCommentChars СимволыМногострочногоКомментарияMultiLineNotAsteriskChar МногострочныйСимвНеЗвёздочкаPostAsteriskCommentChars СимволыКомментарияПослеЗвёздочкиMultiLineNotForwardSlashOrAsteriskChar МногострочныйСимвНеСлэшИлиЗвёздочкаSingleLineCommentChars СимволыОднострочногоКомментарияSingleLineCommentChar СимволОднострочногоКомментарияToken ТокенPunctuator ЗнакПрепинанияNumericLiteral ЧисленныйЛитералStringLiteral СтроковойЛитералReservedWord ЗарезервированноеСловоKeyword КлючевоеСловоFutureReservedWord ЗарезервированноеНаБудущееСловоNullLiteral ЛитералNullBooleanLiteral БулевскийЛитералUnicodeEscapeSequence ЮникоднаяEscapeПоследовательностьIdentifierStart НачалоИдентификатораIdentifierPart ЧастьИдентификатораUnicodeLetter БукваЮникодаUnicodeCombiningMark КомбинирующийЗнакЮникодаUnicodeDigit ЦифраЮникодаUnicodeConnectorPunctuation СоединяющаяПунктуацияЮникодаHexDigit ШестнадцатеричнаяЦифраDivPunctuator ЗнакДеленияLiteral ЛитералDecimalLiteral ДесятичныйЛитералHexIntegerLiteral ШестнадцатеричныйЦелыйЛитералDecimalIntegerLiteral ДесятичныйЦелыйЛитералExponentPart ЭкспоненциальнаяЧастьSignedInteger ЗнаковоеЦелоеExponentIndicator ПризнакЭкспоЗаписиDoubleStringCharacters СимволыДвойнойСтрокиSingleStringCharacters СимволыОдинарнойСтрокиDoubleStringCharacter СимволДвойнойСтрокиSingleStringCharacter СимволОдинарнойСтрокиEscapeSequence EscapeПоследовательность CharacterEscapeSequence СимвольнаяEscapeПоследовательностьHexEscapeSequence ШестнадцатеричнаяEscapeПоследовательностьSingleEscapeCharacter ОдиночныйEscapeСимволNonEscapeCharacter НеEscapeСимволEscapeCharacter EscapeСимволRegularExpressionBody ТелоРегулярногоВыраженияRegularExpressionFlags ФлагиРегулярногоВыраженияRegularExpressionLiteral ЛитералРегулярногоВыраженияRegularExpressionFirstChar ПервыйСимволРегулярногоВыраженияRegularExpressionChars СимволыРегулярногоВыраженияRegularExpressionChar СимволРегулярногоВыраженияNonTerminator НеОкончаниеBackslashSequence ПоследовательностьОбрСлэшPostfixExpression ПостфиксноеВыражениеLeftHandSideExpression ЛевостороннееВыражениеContinueStatement ИнструкцияContinueBreakStatement ИнструкцияBreakThrowStatement ИнструкцияThrowReturnStatement ИнструкцияReturnPropertyName ИмяСвойстваStringNumericLiteral СтроковойЧисленныйЛитералStrWhiteSpace СтрПробеловStrNumericLiteral СтрЧисленныйЛитералStrWhiteSpaceChar СтрСимвПробелаStrDecimalLiteral СтрДесятичныйЛитералStrUnsignedDecimalLiteral СтрБеззнаковыйДесятичныйЛитералFunctionDeclaration ОбъявлениеФункцииFunctionExpression ВыражениеФункцииFunctionBody ТелоФункцииFormalParameterList СписокФормальныхАргументовVariableDeclaration ОбъявлениеПеременнойVariableDeclarationNoIn ОбъявлениеПеременнойБезInPrimaryExpression ПервичноеВыражениеArrayLiteral ЛитералМассиваObjectLiteral ЛитералОбъектаElision ПропускElementList СписокЭлементовPropertyNameAndValueList СписокИмёнСвойствИЗначенийMemberExpression ВыражениеЭлементаArguments АргументыNewExpression ВыражениеNewCallExpression ВыражениеCallUnaryExpression УнарноеВыражениеMultiplicativeExpression МультипликативноеВыражение

Page 255: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

AdditiveExpression АддитивноеВыражениеShiftExpression ВыражениеСдвигаRelationalExpression ВыражениеОтношенияRelationalExpressionNoIn ВыражениеОтношенияБезInEqualityExpression ВыражениеРавенстваEqualityExpressionNoIn ВыражениеРавенстваБезInBitwiseANDExpression ВыражениеПобитовогоИBitwiseANDExpressionNoIn ВыражениеПобитовогоИБезInBitwiseXORExpression ВыражениеПобитовогоИскИЛИBitwiseXORExpressionNoIn ВыражениеПобитовогоИскИЛИБезInBitwiseORExpression ВыражениеПобитовогоИЛИBitwiseORExpressionNoIn ВыражениеПобитовогоИЛИБезInLogicalANDExpression ВыражениеЛогическогоИLogicalANDExpressionNoIn ВыражениеЛогическогоИБезInLogicalORExpression ВыражениеЛогическогоИЛИLogicalORExpressionNoIn ВыражениеЛогическогоИЛИБезInConditionalExpression УсловноеВыражениеConditionalExpressionNoIn УсловноеВыражениеБезInAssignmentExpressionNoIn ВыражениеПрисваиванияБезInAssignmentOperator ОператорПрисваиванияBlock БлокVariableStatement ИнструкцияПеременнойEmptyStatement ПустаяИнструкцияExpressionStatement ИнструкцияВыражениеIfStatement ИнструкцияIfIterationStatement ИнструкцияИтерацииLabelledStatement ИнструкцияСМеткойSwitchStatement ИнструкцияSwitchTryStatement ИнструкцияTryStatementList СписокИнструкцийVariableDeclarationList СписокОбъявленияПеременныхVariableDeclarationListNoIn СписокОбъявленияПеременныхБезInInitialiserNoIn ИнициализаторБезInEmptyStatement ПустаяИнструкцияCaseBlock БлокCaseCaseClauses ВетвиCaseCaseClause ВетвьCaseDefaultClause ВетвьПоУмолчаниюCatch CatchFinally FinallySourceElements ЭлементыИсходногоКодаScope ОбластьВидимостиSourceElement ЭлементИсходногоКодаuri uriuriCharacters символыUriuriCharacter символUriuriReserved uriЗарезервированныйuriUnescaped uriНеэкранированныйuriEscaped uriЭкранированныйuriAlpha uriБукваuriMark uriЗнакDay ДеньmsPerDay мсВСуткахTimeWithinDay ВремяДняDaysInYear ДнейВГодуDayFromYear ДеньДляГодаTimeFromYear ВремяДляГодаYearFromTime ГодДляВремениInLeapYear ВВисокосномГодуMonthFromTime МесяцДляВремениDateFromTime ДатаДляВремениDayWithinYear ДеньГодаWeekDay ДеньНеделиDaylightSavingTA ПопрЛетнееВремяLocalTime МестноеВремяHourFromTime ЧасДляВремениmsPerHour мсВЧасеHoursPerDay ЧасовВСуткахMinFromTime МинутаДляВремениmsPerMinute мсВМинутеMinutesPerHour МинутВЧасеSecFromTime СекундаДляВремениmsPerSecond мсВСекундеSecondsPerMinute СекундВМинутеmsFromTime мсДляВремениMakeTime СоставитьВремяMakeDay СоставитьДеньMakeDate СоставитьДатуTimeClip ОграничитьВремяDisjunction ДизъюнкцияAlternative Альтернатива

Page 256: Стандарт ECMA-262, 3 редакция

http://javascript.ru/ecma[14.03.09 12:52:12]

Term ЭлементAssertion ПроверкаAtom АтомQuantifier ПризнакКоличестваQuantifierPrefix ПрефиксПризнакаКоличестваPatternCharacter СимволШаблонаAtomEscape EscapeАтомCharacterClass КлассСимволовDecimalEscape ДесятичнаяEscapeCharacterEscape СимвольнаяEscapeCharacterClassEscape EscapeКлассаСимволаControlEscape УправляющаяEscape ControlLetter УправляющийСимволIdentityEscape EscapeИдентификатораClassRanges ДиапазоныКлассаNonemptyClassRanges НепустыеДиапазоныКлассаClassAtom АтомКлассаNonemptyClassRangesNoDash НепустыеДиапазоныКлассаБезТиреClassAtomNoDash АтомКлассаБезТиреClassEscape EscapeКлассаCharSet НаборСимволовState СостояниеendIndex конечныйИндексcaptures захватыContinuation ПродолжениеMatcher СличительAssertionTester ПроверщикУсловияEscapeValue EscapeЗначениеRepeatMatcher СличителяПовторовIsWordChar ЯвляетсяСимволомСловаCharacterSetMatcher СличительСНаборомСимволовCanonicalize КаноническаяФормаCharacterRange ДиапазонСимволовOctalIntegerLiteral ВосьмеричныйЦелыйЛитералOctalDigit ВосьмеричнаяЦифраOctalEscapeSequence ВосьмеричнаяEscapeПоследовательностьZeroToThree ОтНуляДоТрёхFourToSeven ОтЧетырёхДоСемиopt опц[lookahead set] [предпросмотр множество]Result(n) Результат(n)Type(x) Тип(x)

Оригинал документа можно скачать на http://javascript.ru/ecma