Об этом справочнике

Об этом файле

Этот CHM-файл является оффлайн-вариантом http://javascript.ru/ecma.
Сборка от 14.08.2010.

В него вошли все материалы, за исключением комментариев.

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

Искренне Ваш,
Илья Кантор.


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

© Ecma International 1999.
Перевод стандарта ECMA-262, 3rd edition 1999.

Данный перевод является официальным и согласован с ECMA.

Скачать оффлайн-вариант в формате CHM

Краткая история

Этот стандарт 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 года.

Спецификация ECMA. Содержание

  • 1. Сфера применения
  • 2. Соответствие
  • 3. Ссылки
  • 4. Общее описание
    • 4.1 Скрипты для Web
    • 4.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 Тип Null
      • 4.3.13 Булевское значение
      • 4.3.14 Тип Boolean
      • 4.3.15 Объект Boolean
      • 4.3.16 Строковое значение
      • 4.3.17 Тип String
      • 4.3.18 Объект String
      • 4.3.19 Численное значение
      • 4.3.20 Тип Number
      • 4.3.21 Объект Number
      • 4.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 Пробел
    • 7.3 Разделители строк
    • 7.4 Комментарии
    • 7.5 Токены
      • 7.5.1 Зарезервированные слова
      • 7.5.2 Ключевые слова
      • 7.5.3 Слова, зарезервированные для будущего использования
    • 7.6 Идентификатор
    • 7.7 Знаки препинания
    • 7.8 Литералы
      • 7.8.1 Литералы Null
      • 7.8.2 Булевские литералы
      • 7.8.3 Числовые литералы
      • 7.8.4 Строковые литералы
      • 7.8.5 Литералы регулярных выражений
    • 7.9 Автоматическая вставка точек с запятыми
      • 7.9.1 Правила автоматической вставки точек с запятыми
      • 7.9.2 Примеры автоматической вставки точек с запятой
  • 8. Типы
    • 8.1 Тип Undefined
    • 8.2 Тип Null
    • 8.3 Тип Boolean
    • 8.4 Тип String
    • 8.5 Тип Number
    • 8.6 Тип Object
      • 8.6.1 Атрибуты свойства
      • 8.6.2 Внутренние свойства и методы
    • 8.7 Тип Reference
      • 8.7.1 ПолучитьЗначение(V)
      • 8.7.2 ЗаписатьЗначение(V, W)
    • 8.8 Тип List
    • 8.9 Тип Completion
  • 9. Преобразование типов
    • 9.1 ToPrimitive
    • 9.2 ToBoolean
    • 9.3 ToNumber
      • 9.3.1 ToNumber применённый к типу String
    • 9.4 ToInteger
    • 9.5 ToInt32: (Знаковое 32-разрядное целое)
    • 9.6 ToUint32: (Беззнаковое 32-разрядное целое)
    • 9.7 ToUint16: (Беззнаковое 16-разрядное целое)
    • 9.8 ToString
      • 9.8.1 ToString применённый к типу Number
    • 9.9 ToObject
  • 10. Контексты исполнения
    • 10.1 Определения
      • 10.1.1 Объекты типа Function
      • 10.1.2 Типы исполняемого кода
      • 10.1.3 Инициализация переменных
      • 10.1.4 Иерархия областей видимости и разрешение идентификаторов
      • 10.1.5 Глобальный объект
      • 10.1.6 Объект активации
      • 10.1.7 This
      • 10.1.8 Объект аргументов
    • 10.2 Вход в контекст исполнения
      • 10.2.1 Глобальный код
      • 10.2.2 Eval-код
      • 10.2.3 Код функции
  • 11. Выражения
    • 11.1 Первичные выражения
      • 11.1.1 Ключевое слово this
      • 11.1.2 Ссылка на идентификатор
      • 11.1.3 Ссылка на литерал
      • 11.1.4 Инициализатор массива
      • 11.1.5 Инициализатор объекта
      • 11.1.6 Оператор группировки
    • 11.2 Левосторонние выражения
      • 11.2.1 Доступ к свойствам
      • 11.2.2 Оператор new
      • 11.2.3 Вызовы функций
      • 11.2.4 Списки аргументов
      • 11.2.5 Выражения функций
    • 11.3 Постфиксные выражения
      • 11.3.1 Постфиксный оператор инкремента
      • 11.3.2 Постфиксный оператор декремента
    • 11.4 Унарные операторы
      • 11.4.1 Оператор delete
      • 11.4.2 Оператор void
      • 11.4.3 Оператор typeof
      • 11.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 Оператор больше-или-равно ( >= )
      • 11.8.5 Абстрактный алгоритм сравнения для отношений
      • 11.8.6 Оператор instanceof
      • 11.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 Инструкция if
    • 12.6 Инструкции итерации
    • 12.6.1 Инструкция do-while
    • 12.6.2 Инструкция while
    • 12.6.3 Инструкция for
    • 12.6.4 Инструкция for-in
    • 12.7 Инструкция continue
    • 12.8 Инструкция break
    • 12.9 Инструкция return
    • 12.10 Инструкция with
    • 12.11 Инструкция switch
    • 12.12 Инструкции с метками
    • 12.13 Инструкция throw
    • 12.14 Инструкция try
  • 13. Определение функции
    • 13.1 Определения
      • 13.1.1 Тождественные правила грамматики
      • 13.1.2 Объединённые объекты
    • 13.2 Создание объектов типа Function
      • 13.2.1 [[Call]]
      • 13.2.2 [[Construct]]
  • 14. Программа
  • 15. Встроенные объекты ECMAScript
    • 15.1 Глобальный объект
      • 15.1.1 Свойства-значения глобального объекта
      • 15.1.2 Свойства-функции глобального объекта
      • 15.1.3 Свойства-функции для обработки URI
      • 15.1.4 Свойства-конструкторы глобального объекта
      • 15.1.5 Другие свойства глобального объекта
    • 15.2 Объекты Object
      • 15.2.1 Вызов конструктора Object как функции
      • 15.2.2 Конструктор Object
      • 15.2.3 Свойства конструктора Object
      • 15.2.4 Свойства объекта-прототипа Object
      • 15.2.5 Свойства экземпляров Object
    • 15.3 Объекты типа Function
      • 15.3.1 Вызов конструктора Function как функции
      • 15.3.2 Конструктор Function
      • 15.3.3 Свойства конструктора Function
      • 15.3.4 Свойства объекта-прототипа Function
      • 15.3.5 Свойства экземпляров Function
    • 15.4 Объекты Array
      • 15.4.1 Вызов конструктора Array как функции
      • 15.4.2 Конструктор Array
      • 15.4.3 Свойства конструктора Array
      • 15.2.4 Свойства объекта-прототипа Array
      • 15.4.5 Свойства экземпляров Array
    • 15.5 Объекты типа String
      • 15.5.1 Вызов конструктора String как функции
      • 15.5.2 Конструктор String
      • 15.5.3 Свойства конструктора String
      • 15.5.4 Свойства объекта-прототипа String
      • 15.5.5 Свойства экземпляров String
    • 15.6 Объекты типа Boolean
      • 15.6.1 Вызов конструктора Boolean как функции
      • 15.6.2 Конструктор Boolean
      • 15.6.3 Свойства конструктора Boolean
      • 15.6.4 Свойства объекта-прототипа Boolean
      • 15.6.5 Свойства экземпляров Boolean
    • 15.7 Объекты типа Number
      • 15.7.1 Вызов конструктора Number как функции
      • 15.7.2 Конструктор Number
      • 15.7.3 Свойства конструктора Number
      • 15.7.4 Свойства объекта-прототипа Number
      • 15.7.5 Свойства экземпляров Number
    • 15.8 Объект Math
      • 15.8.1 Свойства-значения объекта Math
      • 15.8.2 Свойства-функции объекта Math
    • 15.9 Объекты типа Date
      • 15.9.1 Общие сведения об объектах типа Date и определения внутренних операторов
      • 15.9.2 Вызов конструктора Date как функции
      • 15.9.3 Конструктор Date
      • 15.9.4 Свойства конструктора Object
      • 15.9.5 Свойства объекта-прототипа Date
      • 15.9.6 Свойства экземпляров Date
    • 15.10 Объекты типа RegExp (регулярные выражения)
      • 15.10.1 Шаблоны
      • 15.10.2 Семантика шаблонов
      • 15.10.3 Вызов конструктора RegExp как функции
      • 15.10.4 Конструктор RegExp
      • 15.10.5 Свойства конструктора RegExp
      • 15.10.6 Свойства объекта-прототипа RegExp
      • 15.10.7 Свойства экземпляров RegExp
    • 15.11 Объекты Error
      • 15.11.1 Вызов конструктора Error как функции
      • 15.11.2 Конструктор Error
      • 15.11.3 Свойства конструктора Error
      • 15.11.4 Свойства объекта-прототипа Error
      • 15.11.5 Свойства экземпляров Error
      • 15.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 может поддерживать программный синтаксис, который использует "слова, зарезервированные на будущее", перечисленные в п.7.5.3 этой спецификации.


Ссылки

3. Ссылки

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

ISO/IEC 10646-1: 1993 Information Technology --Universal Multiple-Octet Coded Character Set (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 of Electrical and Electronic Engineers, New York (1985).


Общий обзор

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

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

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

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

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

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

  • Gosling, James, Bill Joy and Guy Steele. The Java™ Language Specification. Addison Wesley Publishing Co., 1996.
  • Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando, FL, October 1987.
4.1 Скрипты для интернет

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

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

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

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

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

ECMAScript является объектным языком: базовый язык и средства среды предоставлены в виде объектов, и программа на ECMAScript представляет совокупность общающихся объектов. Объект ECMAScript представляет собой неупорядоченный набор свойств, каждое из которых обладает нулём или более атрибутов, которые определяют, как может использоваться каждое из свойств (например, когда атрибут ReadOnly установлен в true, любая попытка выполняемого кода на ECMAScript изменить значение этого свойства не возымеет результата. Свойства являются контейнерами, содержащими другие объекты, элементарные значения или методы. Элементарное значение - значение, имеющее один из следующих встроенных типов: Undefined, Null, Boolean, Number или String. Объект - значение, имеющее последний оставшийся встроенный тип Object; а метод является функцией, связанной с объектом через свойство.

ECMAScript определяет набор встроенных объектов, которые завершают определение сущностей ECMAScript. К этим встроенным объектам принадлежат объекты Global, Object, Function, Array, String, Boolean, Number, Math, Date, RegExp и объекты Error: Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError и URIError.

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

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

4.2.1 Объекты

ECMAScript не содержит классов в строгом понимании этого слова, как в C++, Smalltalk или Java, но вместо этого поддерживает конструкторы, которые создают объект путём выполнения кода, который выделяет память для объектов и инициализирует их полностью или частично путём присвоения начальных значений их свойствам. Все конструкторы являются объектами, но не все объекты являются конструкторами. Каждый конструктор обладает свойством Prototype, которое используется для реализации прототипного наследования и разделяемых свойств. Объекты создаются путём использования конструкторов в выражениях new; например, new String("A String") создаёт новый объект String. Вызов конструктора без использования new имеет последствия, зависящие от конструктора. Например, String("A String") создаёт элементарную строку, а не объект.

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

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

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

неявный прототип связь явный прототип связь 15 -4

CF - конструктор (который также является объектом). Пять объектов было создано с использованием выражения new: cf1, cf2, cf3, cf4 и cf5. Каждый из этих объектов содержит свойства с именами q1 и q2. Пунктирная линия представляет отношение неявного прототипа; таким образом, например, прототипом cf3 является CFp. Конструктор CF сам обладает двумя свойствами с именами P1 и P2, которые не видны CFp, cf1, cf2, cf3, cf4 и cf5. Свойство CFP1 в CFp разделяют cf1, cf2, cf3, cf4 и cf5 (но не CF), аналогично и другие свойства, находящиеся в неявной иерархии прототипов CFp, имеющие имена, отличные от q1, q2 и CFP1. Заметим, что между CF и CFp нет неявной прототипной связи.

В отличие от объектных языков, использующих классы, свойства могут быть добавлены к объектам динамически путём присвоения им значений. Таким образом, конструкторы не обязаны указывать имена или присваивать значения всем свойствам создаваемого объекта. Для вышеприведённой диаграммы можно добавить новое разделяемое свойство для cf1, cf2, cf3, cf4 и cf5 путём присвоения нового значения свойству CFp.

4.3 Определения

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

4.3.1 Тип

Тип - набор значений данных.

4.3.2 Элементарное значение

Элементарное значение - значение одного из типов Undefined, Null, Boolean, Number или String. Элементарное значение - единица данных, представляемая напрямую на самом нижнем уровне реализации языка.

4.3.3 Объект

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

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

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

4.3.5 Прототип

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

4.3.6 Встроенные объекты

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

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

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

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

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

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

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

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

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

4.3.11 Пустое значение

Пустое (null) значение - элементарное значение, которое обозначает пустую или отсутствующую ссылку.

4.3.12 Тип Null

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

4.3.13 Булевское значение

Булевское значение - один из двух уникальных элементов типа Boolean: true (истина) или false (ложь).

4.3.14 Тип Boolean

Тип Boolean представляет собой логическую сущность и содержит в точности два уникальных значения. Первое называется true, а второе - false.

4.3.15 Объект Boolean

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

4.3.16 Строковое значение

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

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

4.3.17 Тип String

Тип String представляет собой множество всех строковых значений.

4.3.18 Объект String

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

4.3.19 Числовое значение

Числовое значение имеет тип Number, который является прямым представлением числа.

4.3.20 Тип Number

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

4.3.21 Объект Number

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

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

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

4.3.23 NaN

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


Соглашения о наименованиях

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

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

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

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

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

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, он предварительно преобразуется в поток входных элементов путём рекурсивного применения правил лексической грамматики. Затем этот поток входных элементов распознаётся путём однократного применения синтаксической грамматики. Программа считается синтаксически неверной, если токены потока входных элементов не могут быть распознаны как единичный экземпляр начального нетерминала Программа без оставшихся избыточных токенов.

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

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

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

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

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

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

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

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

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

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

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

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

и что:

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

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

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

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

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

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

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

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

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

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

ДесятичнаяЦифра :: одна из
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

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

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

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

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

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

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

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

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

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

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

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

Математические операции, такие как сложение, вычитание, отрицание, умножение, деление и математические функции, определенные ниже в данном разделе всегда должны пониматься как вычисление точного математического результата в математических вещественных числах, которые не включают бесконечностей и отрицательного нуля, отличающегося от положительного нуля. Алгоритмы данного стандарта, моделирующие работу арифметики с плавающей запятой, при необходимости явно включают в себя шаги по произведению округлений и обработке бесконечностей и знакового нуля. Если математическая операция или функция применяется к числу с плавающей запятой, её следует понимать как применённую к точному математическому значению, представленному этим числом. Такое число с плавающей запятой должно быть конечным, и если оно равняется +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 может содержать любые символы Юникода. Все символы Юникода, означающие пробел, обрабатываются как символ пробела, и все символы Юникода, обозначающие разделение строк или абзацев, обрабатываются как разделители строк. Не принадлежащие к латинице символы Юникода разрешены к использованию в идентификаторах, строковых литералах, литералах регулярных выражений и комментариях.

Далее по тексту документа словосочетание "кодовая точка" и слово "символ" будут использоваться для обозначения 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. Лексические соглашения

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

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

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

Синтаксис

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

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

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

7.2 Пробел

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

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

Код Юникода | Наименование | Формальное наименование
\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>

Синтаксис

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

Описание

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

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

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

Синтаксис

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

Синтаксис

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

Описание

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

Синтаксис

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

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

Синтаксис

КлючевоеСлово :: одно из
break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof
7.5.3 Слова, зарезервированные для будущего использования

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

Синтаксис

ЗарезервированноеНаБудущееСлово :: one of
abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger 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Последовательность
ЧастьИдентификатора ::
НачалоИдентификатора
КомбинирующийЗнакЮникода
ЦифраЮникода
СоединяющаяПунктуацияЮникода
\ Юникодная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 Знаки препинания

Синтаксис

ЗнакПрепинания :: один из
{
}
(
)
[
]
.
;
,
<
>
<=
>=
==
!=
===
!==
+
-
*
%
++
--
<<
>>
>>>
&
|
^
!
~
&&
||
?
:
=
+=
-=
*=
%=
<<=
>>=
>>>=
&=
|=
^=
ЗнакДеления :: один из
/
/=
7.8 Литералы

Синтаксис

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

Синтаксис

ЛитералNull ::
null

Семантика

Значеним 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
ЗнаковоеЦелое ::
ДесятичныеЦифры
+ ДесятичныеЦифры
- ДесятичныеЦифры
ШестнадцатеричныйЦелыйЛитерал ::
ШестнадцатеричнаяЦифра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 равно числу символов в ДесятичныхЦифрах.
  • МЗ ДесятичныхЦифр :: ДесятичнойЦифры равняется МЗ ДесятичнойЦифры.
  • МЗ ДесятичныхЦифр :: ДесятичныхЦифр ДесятичнойЦифры равняется (МЗ ДесятичныхЦифр умножить на 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 и затем увеличение литерала на единицу в позиции двадцатой значащей цифры. Цифра является значащей, если она не принадлежит ЭкспоненциальнойЧасти и

  • она не равна 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
Шестнадцатеричная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Символом согласно следующей таблице:
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).

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

Синтаксис

ЛитералРегулярногоВыражения ::
/ ТелоРегулярногоВыражения / ФлагиРегулярногоВыражения
ТелоРегулярногоВыражения ::
ПервыйСимволРегулярногоВыражения СимволыРегулярногоВыражения
СимволыРегулярногоВыражения ::
[пусто]
СимволыРегулярногоВыражения СимволРегулярногоВыражения
ПервыйСимволРегулярногоВыражения ::
НеОкончание но не * или \ или /
ПоследовательностьОбрСлэш
СимволРегулярногоВыражения ::
НеОкончание но не\ или /
ПоследовательностьОбрСлэш
ПоследовательностьОбрСлэш ::
\ НеОкончание
НеОкончание ::
ИсходныйСимвол но не КонецСтроки
ФлагиРегулярногоВыражения ::
[пусто]
ФлагиРегулярногоВыражения ЧастьИдентификатора

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

Семантика

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

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

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

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

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

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

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

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

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

ПостфиксноеВыражение :
ЛевостороннееВыражение [здесь нет КонцаСтроки] ++
ЛевостороннееВыражение [здесь нет КонцаСтроки] --
ИнструкцияContinue :
continue [здесь нет КонцаСтроки] Идентификаторопц ;
ИнструкцияBreak :
break [здесь нет КонцаСтроки] Идентификаторопц ;
Инструкция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 и не изменяется правилами автоматической вставки точек с запятой, так как точка с запятой подставилась бы в заголовок инструкции 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()

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


Типы

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-разрядных целых чисел; они не гарантируют нормализованности результирующей строки и не гарантируют языкозависимых результатов.

Замечание
Основанием для подобных решений было стремление сделать реализации типа 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 или -1, m - положительное целое меньше, чем 253, но не меньше чем 252 и 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 может со временем изменяться в зависимости от действий, производимых средой выполнения. Таким образом "только для чтения" не означает "постоянное и неизменное"!)
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]] | (Подсказка) | Возвращает для объекта значение по умолчанию, которое должно являться элементарным значением (не объект или ссылка).
[[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)

Когда метод [[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)

Когда метод [[Put]] объекта 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.

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, предпринимаются следующие шаги:

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 в вызове функции.

Значение 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 используется только как промежуточный результат вычисления выражения и не может быть сохранено как переменная или свойство.

Тип 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 | Результат совпадает с входным аргументом (преобразование не производится).
Boolean | Результат совпадает с входным аргументом (преобразование не производится).
Number | Результат совпадает с входным аргументом (преобразование не производится).
String | Результат совпадает с входным аргументом (преобразование не производится).
Object | Возвращает значение по умолчанию для объекта. Значение по умолчанию для объекта получается путём вызова для объекта внутреннего метода [[DefaultValue]] с передачей ему опциональной подсказки ПредпочтительныйТип. Поведение метода [[DefaultValue]] определяется данной спецификацией для всех встроенных объектов ECMAScript (8.6.2.6).
9.2 ToBoolean

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

Входной тип | Результат
Undefined | false
Null | false
Boolean | Результат совпадает с входным аргументом (преобразование не производится).
Number | Результат равен false, если аргумент равен +0, -0 или NaN, иначе результат равен true.
String | Результат равен false, если аргумент является пустой строкой (его длина равна нулю), иначе результат равен true.
Object | true
9.3 ToNumber

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

Входной тип | Результат
Undefined | NaN
Null | +0
Boolean | Результат равен 1, если аргумент равен true. Результат равен +0, если аргумент равен false.
Number | Результат совпадает с входным аргументом (преобразование не производится).
String | См. грамматику и замечание ниже.
Object Применяются следующие шаги:

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

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

3. Вернуть Результат(2).
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
ЭкспоненциальнаяЧасть :::
ПризнакЭкспоЗаписи ЗнаковоеЦелое
ПризнакЭкспоЗаписи ::: один из
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 в зависимости от обстоятельств.)
  • МЗ СтрБеззнаковогоДесятичногоЛитерала ::: 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.
  • МЗ ШестнадцатеричнойЦифры ::: 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))).

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 целых значений в диапазоне от 0 до 216-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, численное значение 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. Исходные коды программ из данной работы доступны по адресам 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:

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

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

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

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

Когда управление входит в контексты выполнения, по ходу исполнения кода на 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 Вход в контекст исполнения

Каждый вызов функции или конструктора входит в новый контекст исполнения, даже если функция вызывает себя рекурсивно. Каждый возврат (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 является глобальный объект.


Выражения

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 и индексы последующих элементов. Опущенные элементы массива являются неопределёнными.

Синтаксис

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

Семантика

Значение нетерминала ЛитералМассива : [ Пропускопц ] вычисляется по следующей схеме:

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).

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, записанное в форме литерала. Оно представляет собой заключённый в фигурные скобки список из нуля или более названий свойств и соответствующих им значений. Значения не обязательно должны быть литералами - они вычисляются каждый раз, когда вычисляется значение инициализатора.

Синтаксис

ЛитералОбъекта :
{}
{ СписокИмёнСвойствИЗначений }
СписокИмёнСвойствИЗначений :
ИмяСвойства : ВыражениеПрисваивания
СписокИмёнСвойствИЗначений , ИмяСвойства : ВыражениеПрисваивания
ИмяСвойства :
Идентификатор
СтроковойЛитерал
ЧисленныйЛитерал

Семантика

Значение нетерминала ЛитералОбъекта : {} вычисляется по следующей схеме:

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).

Значение нетерминала ИмяСвойства : СтроковойЛитерал вычисляется по следующей схеме:

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 . Идентификатор
Аргументы :
()
( СписокАргументов )
СписокАргументов :
ВыражениеПрисваивания
СписокАргументов , ВыражениеПрисваивания
ЛевостороннееВыражение :
Выражение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.

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]] - бросить исключение 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. Вычислить значение ВыраженияПрисваивания.

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)).

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

Значение нетерминала УнарноеВыражение : 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), используя те же правила, что и для оператора - (см. раздел 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-битное целое число.

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 Действие оператора *

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

Результат произведения чисел с плавающей точкой соответствует правилам арифметики двойной точности стандарта IEEE 754:

  • Если хотя бы один из операндов равен NaN, результат равен NaN.
  • Знак результата положителен, если знаки операндов совпадают, и отрицателен, если знаки операндов различны.
  • Умножение бесконечности на ноль даёт NaN.
  • Умножение бесконечности на бесконечность даёт бесконечность. Знак определяется по приведённому выше правилу.
  • Произведение бесконечности на конечное ненулевое значение даёт знаковую бесконечность. Знак определяется по приведённому выше правилу.
  • В оставшихся случаях, когда среди операндов не встречаются ни бесконечность, ни NaN, произведение вычисляется и округляется к ближайшему представимому значению согласно режиму IEEE "округлить-к-ближайшему". Если модуль числа слишком велик и не может быть представлен, то результатом является бесконечность соответствующего знака. Если модуль числа слишком мал и не может быть представлен, то результатом является ноль соответствующего знака. Язык ECMAScript требует поддержки "постепенного недополнения" согласно стандарту IEEE 754.
11.5.2 Действие оператора /

Оператор / производит деление, генерируя частное своих операндов. Левый операнд является делимым, а правый - делителем. ECMAScript не производит целочисленного деления. Операнды и результат деления являются вещественными числами с плавающей точкой двойной точности. Результат деления определён спецификацией арифметики стандарта IEEE 754:

  • Если хотя бы один из операндов равен NaN, результат равен NaN.
  • Знак результата положителен, если знаки операндов совпадают, и отрицателен, если знаки операндов различны.
  • Деление бесконечности на бесконечность даёт NaN.
  • Деление бесконечности на ноль даёт бесконечность. Знак определяется по приведённому выше правилу.
  • Деление бесконечности на конечное ненулевое значение даёт знаковую бесконечность. Знак определяется по приведённому выше правилу.
  • Деление конечного значения на бесконечность даёт ноль. Знак определяется по приведённому выше правилу.
  • Деление нуля на ноль даёт NaN, деление нуля на любое другое конечное значение даёт ноль, знак которого определяется по приведённому выше правилу.
  • Деление ненулевого конечного значения на ноль даёт знаковую бесконечность. Знак определяется по приведённому выше правилу.
  • В оставшихся случаях, когда среди операндов не встречаются ни бесконечность, ни ноль, ни NaN, частное вычисляется и округляется к ближайшему представимому значению согласно режиму IEEE "округлить-к-ближайшему". Если модуль числа слишком велик и не может быть представлен, происходит переполнение и результатом является бесконечность соответствующего знака. Если модуль числа слишком мал и не может быть представлен, происходит недополнение (потеря точности) и результатом является ноль соответствующего знака. Язык 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. Вычислить значение АддитивногоВыражения.

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)).

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 Оператор сдвига влево ( << )

Производит операцию побитового сдвига влево на левом операнде, сдвигая его на количество бит, указанное в правом операнде.

Значение нетерминала ВыражениеСдвига : ВыражениеСдвига << АддитивноеВыражение вычисляется по следующей схеме:

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 Оператор беззнакового сдвига вправо ( >>> )

Производит операцию побитового сдвига вправо с дополнением нулём на левом операнде, сдвигая его на количество бит, указанное в правом операнде.

Значение нетерминала ВыражениеСдвига : ВыражениеСдвига >>> АддитивноеВыражение вычисляется по следующей схеме:

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 и обозначает, существует ли определяемое оператором отношение между двумя операндами

Значения нетерминалов ВыражениеОтношенияБез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.

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) меньше, чем математическое значение Результата(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

Значение нетерминала ВыражениеОтношения : ВыражениеОтношения 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 Оператор равенства ( == )

Значение нетерминала ВыражениеРавенства : ВыражениеРавенства == ВыражениеОтношения вычисляется по следующей схеме:

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. Если 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.

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 будут не равны друг другу.

Сравнение строк производит простую проверку равенства последовательностей значений кодов символов. Не предпринимается попыток использования более сложных, семантически ориентированных определений равенства строк или символов и схем упорядочения строк, описанных в спецификации Юникода версии 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.

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.

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).

Значение нетерминала ВыражениеЛогическогоИЛИ : ВыражениеЛогическогоИЛИ || ВыражениеЛогическогоИ вычисляется по следующей схеме:

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.

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 Простое присваивание ( = )

Значение нетерминала ВыражениеПрисваивания : ЛевостороннееВыражение = ВыражениеПрисваивания вычисляется по следующей схеме:

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)).

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

Значение нетерминала ВыражениеБезIn вычисляется по той же схеме, что и для нетерминала Выражение за исключением того, что значения вложенных ВыраженияБезIn и ВыраженияПрисваиванияБезIn вычисляются соответственно вместо вложенных Выражения и ВыраженияПрисваивания.


Синтаксис

12 Инструкции

Синтаксис

Инструкция :
Блок
ИнструкцияПеременной
ПустаяИнструкция
ИнструкцияВыражение
ИнструкцияIf
ИнструкцияИтерации
ИнструкцияContinue
ИнструкцияBreak
ИнструкцияReturn
ИнструкцияWith
ИнструкцияСМеткой
ИнструкцияSwitch
ИнструкцияThrow
ИнструкцияTry

Семантика

Инструкция может быть частью ИнструкцииСМеткой, которая тоже может являться частью ИнструкцииСМеткой, и так далее. Определённые таким образом метки совместно называются в описаниях семантики отдельных инструкций "текущим набором меток". ИнструкцияСМеткой не имеет никакого семантического предназначения кроме добавления новой метки к набору меток. Набор меток ИнструкцииИтерации или ИнструкцииSwitch изначально содержит единственный элемент пусто. Набор меток любой другой инструкции изначально пуст.

12.1 Блок

Синтаксис

Блок :
{ СписокИнструкцийопц }
СписокИнструкций :
Инструкция
СписокИнструкций Инструкция

Семантика

Значение нетерминала Блок : {} вычисляется по следующей схеме:

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
ОбъявлениеПеременной :
Идентификатор Инициализаторопц
ОбъявлениеПеременнойБезIn :
Идентификатор ИнициализаторБезInопц
Инициализатор :
= ВыражениеПрисваивания
ИнициализаторБезIn :
= ВыражениеПрисваиванияБезIn

Описание

Если инструкция переменной встречается внутри ОбъявленияФункции, переменные объявляются внутри локальной области видимости для данной функции согласно описанию в разделе 10.1.3. В противном случае они объявляются в глобальной области видимости (т.е. создаются как поля глобального объекта согласно описанию в разделе 10.1.3) с использованием атрибутов свойств { DontDelete }. Переменные создаются, когда происходит вход в область выполнения. Блок не определяет новой области выполнения. Только Программа и ОбъявлениеФункции создают новую область видимости. Переменные инициализируются при создании значением undefined. Переменной, для которой определён Инициализатор, присваивается значение его ВыраженияПрисваивания в момент выполнения ИнструкцииПеременной, а не в момент создания переменной.

Семантика

Значение нетерминала ИнструкцияПеременной : var СписокОбъявленияПеременных ; вычисляется по следующей схеме:

1. Вычислить значение СпискаОбъявленияПеременных.

2. Вернуть (normal, empty, empty).

Значение нетерминала СписокОбъявленияПеременных :ОбъявлениеПеременной вычисляется по следующей схеме:

1. Вычислить значение ОбъявленияПеременной.

Значение нетерминала СписокОбъявленияПеременных : СписокОбъявленияПеременных , ОбъявлениеПеременной вычисляется по следующей схеме:

1. Вычислить значение СпискаОбъявленияПеременных.

2. Вычислить значение ОбъявленияПеременной.

Значение нетерминала ОбъявлениеПеременной : Идентификатор вычисляется по следующей схеме:

1. Вернуть строковое значение, содержащее ту же последовательность символов, что и Идентификатор.

Значение нетерминала ОбъявлениеПеременной : Идентификатор Инициализатор вычисляется по следующей схеме:

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, т.к. тогда оно было бы неотличимо от ОбъявленияФункции.

Семантика

Значение нетерминала ИнструкцияВыражение : [предпросмотр ∉ {{, 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).

7. Вычислить значение второй Инструкции.

8.Вернуть Результат(7).

Значение нетерминала ИнструкцияIf : if ( Выражение ) Инструкция вычисляется по следующей схеме:

1. Вычислить значение Выражения.

2. Вызвать ПолучитьЗначение(Результата(1)).

3. Вызвать ToBoolean(Результат(2)).

4. Если Результат(3) равен false - вернуть (normal, empty, empty).

5. Вычислить значение Инструкции.

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 ( Выражение ) Инструкция вычисляется по следующей схеме:

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.

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.

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.

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

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).

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
Блок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.
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).

Значение нетерминала Ветвь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 [здесь нет КонцаСтроки] Выражение ;

Семантика

Значение нетерминала Инструкция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).

Значение нетерминала Инструкция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 Идентификатор ( СписокФормальныхАргументовопц ){ ТелоФункции }
ВыражениеФункции :
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).

ЗАМЕЧАНИЕ
ТелоФункции в ВыражениеФункции может ссылаться на Идентификатор, указанный в этом же ВыраженииФункции, чтобы функция могла рекурсивно вызывать себя. Однако в отличие от ОбъявленияФункции Идентификатор ВыраженияФункции не влияет на область видимости, в которой находилось ВыражениеФункции, и не может использоваться для ссылки на функцию из этой области видимости.

Значение нетерминала ТелоФункции : ЭлементыИсходногоКода вычисляется по следующей схеме:

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 тоже автоматически окажутся объединёнными.

ЗАМЕЧАНИЕ
Два или более объединённых объекта практически неразличимы, за исключением того, что они могут обладать различными внутренними свойствами. Данная спецификация определяет только одно внутреннее свойство, которое может различаться у таких объектов - [[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 }.

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 и, таким образом, их исходные коды не тождественны.

На практике скорее всего окажется целесообразным объединять объекты типа 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).


Программа

14. Программа

Синтаксис

Программа :
ЭлементыИсходногоКода
ЭлементыИсходногоКода :
ЭлементИсходногоКода
ЭлементыИсходногоКода ЭлементИсходногоКода
ЭлементИсходногоКода :
Инструкция
ОбъявлениеФункции

Семантика

Значение нетерминала Программа : ЭлементыИсходногоКода вычисляется по следующей схеме:

1. Обработать объявления функций в ЭлементахИсходногоКода.

2. Вычислить значение ЭлементовИсходногоКода.

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

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

1. Обработать объявления функций в ЭлементеИсходногоКода.

Значение нетерминала ЭлементыИсходногоКода : ЭлементИсходногоКода вычисляется по следующей схеме:

1. Вычислить значение ЭлементаИсходногоКода.

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

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

1. Обработать объявления функций в ЭлементахИсходногоКода.

2. Обработать объявления функций в ЭлементеИсходногоКода.

Значение нетерминала ЭлементыИсходногоКода : ЭлементыИсходногоКода ЭлементИсходногоКода вычисляется по следующей схеме:

1. Вычислить значение ЭлементовИсходногоКода.

2. Если Результат(1) является неожиданным завершением, вернуть Результат(1).

3. Вычислить значение ЭлементаИсходногоКода.

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

Нетерминал ЭлементИсходногоКода : Инструкция никак не обрабатывается для получения объявлений функций.

Значение нетерминала ЭлементИсходногоКода : Инструкция вычисляется по следующей схеме:

1. Вычислить значение Инструкции.

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

Нетерминал ЭлементИсходногоКода : ОбъявлениеФункции обрабатывается для получения объявлений функций следующим образом:

1. Обработать ОбъявлениеФункции для получения объявлений функций (см. раздел 13).

Значение нетерминала ЭлементИсходногоКода : ОбъявлениеФункции вычисляется по следующей схеме:

1. Вернуть (normal, empty, empty).


Встроенные объекты ECMAScript

15 Встроенные объекты ECMAScript

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

Если иное не указывается явно, свойство [[Class]] встроенного объекта равно либо "Function", если у этого встроенного объекта есть свойство [[Call]], либо "Object", если у этого встроенного объекта нет свойства [[Call]].

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

Если иное не указывается явно в описании конкретной функции, если функции или конструктору, описанному в данном разделе, передано меньше параметров, чем указано в его описании, функция или конструктор будет вести себя, как будто ему (ей) было передано достаточное количество дополнительных аргументов, каждый из которых представляет собой значение undefined value.

Если иное не указывается явно в описании конкретной функции, если функции или конструктору, описанному в данном разделе, передано больше параметров, чем указано в его описании, поведение функции или конструктора не определено. В частности, реализациям разрешается (но не предписывается в обязательном порядке) бросать в этом случае исключение 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 Свойства-значения глобального объекта
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).

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 может обработать только начальную часть строки в качестве целочисленного значения; она игнорирует все символы, которые не могут являться частью записи числа, и не выдаёт никакого оповещения о том, что эти символы были проигнорированы.

Когда radix равно 0 или undefined, а число, содержащееся в строке начинается с цифры 0, за которой не следует x или X, то реализация может по собственному усмотрению трактовать число либо как восьмеричное, либо как десятичное. Рекомендуется, чтобы реализации в данном случае трактовали число как десятичное.

15.1.2.3 parseFloat(string)

Функция parseFloat возвращает численное значение, получаемое в результате интерпретации содержимого строкового аргумента string как десятичного литерала.

Когда вызывается функция parseFloat, предпринимаются следующие шаги:

1. Вызвать ToString(string).

2. Вычислить подстроку Результата(1), состоящую из первого символа слева, не являющегося СтрСимвПробела и всех символов справа от него. (Иными словами, удалить начальные пробелы.)

3. Если ни Результат(2), ни любой из префиксов Результата(2) не удовлетворяет синтаксису СтрДесятичногоЛитерала, вернуть NaN.

4. Вычислить как можно более длинный префикс Результата(2) (он может совпадать с самим Результатом(2)), который удовлетворяет синтаксису СтрДесятичногоЛитерала.

5. Вернуть численное значение МЗ Результата(4).

ЗАМЕЧАНИЕ
parseFloat может обработать только начальную часть строки в качестве численного значения; она игнорирует все символы, которые не могут являться частью записи числа, и не выдаёт никакого оповещения о том, что эти символы были проигнорированы.

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 предоставляют дополнительные функции и методы для манипуляций с веб-страницами. Описание таких функций не входит в задачи данного стандарта.

URI состоит из последовательности компонент, разделённых разделителями компонент. Общий формат:

Схема : Первая / Вторая ; Третья ? Четвёртая

где выделенные курсивом имена обозначают компоненты, а ":", "/", ";" и "?" зарезервированы в качестве символов-разделителей. Функции encodeURI и decodeURI предназначены для работы с полными URI. Они предполагают, что все зарезервированные символы в URI имеют специальное значение и поэтому не подлежат кодированию. Функции encodeURIComponent и decodeURIComponent предназначены для работы с компонентами 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] результатом будет единичный октет с тем же значением.) Результирующая последовательность октетов затем преобразуется в строку, в которой каждый октет представляется 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.

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.

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.

ЗАМЕЧАНИЕ 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 | 0zzzzzzz
0x0080 - 0x07FF | 00000yyy yyzzzzzz | 110yyyyy | 10zzzzzz
0x0800 - 0xD7FF | xxxxyyyy yyzzzzzz | 1110xxxx | 10yyyyyy | 10zzzzzz
0xD800 - 0xDBFF
за которым следует
0xDC00 - 0xDFFF 		110110vv vvwwwwxx
за которым следует
110111yy yyzzzzzz 		11110uuu 10uuwwww 10xxyyyy 10zzzzzz
0xD800 -0xDBFF
за которым не следует
0xDC00 - 0xDFFF 		вызывает URIError
0xDC00 - 0xDFFF | вызывает URIError
0xE000 - 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, плюс "#".

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

Когда функция 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(...)

См. раздел 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 Объекты Object
15.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.

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).

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.

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 Объекты типа Function
15.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)

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

Когда конструктор 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 автоматически создаётся для каждой функции с целью обеспечения возможности использования функции в качестве конструктора.

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

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. Таким образом, она не может быть передана другим типам объектов для использования в качестве метода.

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}.

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, как если бы конструктор функции был бы вызван с теми же аргументами (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 }.

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) равен нулю - вернуть пустую строку.

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.

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)).

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).

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. Таким образом, она может быть передана другим типам объектов для использования в качестве метода. Возможность применения функции push к объектам среды зависит от реализации.

15.4.4.8 Array.prototype.reverse()

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

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

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.

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 специально сделана не привязанной к типу. Она не требует, чтобы её значение 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.

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 < len
  • 0 <= j < len
  • this не обладает свойством с именем 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, каждое из которых меньше Результата(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).

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)).

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.

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 к объектам среды зависит от реализации.

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)).

Значение свойства 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).

16. Возврат.

15.4.5.2 length

Свойство length данного объекта типа Array всегда численно больше, чем имя каждого свойства, имя которого является индексом массива.

Свойство length обладает атрибутами { DontEnum, DontDelete }.

15.5 Объекты типа String
15.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 [,...]]])

Вернуть строку, содержащую количество символов, равное количеству аргументов. Каждый аргумент описывает по одному символу результирующей строки. Первый аргумент описывает первый символ и так далее, слева направо.. Аргумент преобразовывается в символ путём применения операции 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).

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).

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 специально сделана не привязанной к типу. Она не требует, чтобы её значение 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 (преобразованным в строку). Алгоритм сравнения двух строк зависит от реализации. Подразумевается, что результат сравнения упорядочивает строки согласно порядку, определённому текущими языковыми настройками системы, и имеет отрицательное, нулевое или положительное значение в зависимости от того, идёт ли 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 в качестве параметра.
  • Если 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, который не подходит ни к одной из нижеприведённых форм, остаётся в том виде, в котором есть.

Символы | Заменяющий текст
$$ $
$& Найденная подстрока.
$` Часть 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).

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", ""].)

Если значение 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.

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. Таким образом, она может быть передана другим типам объектов для использования в качестве метода.

ЗАМЕЧАНИЕ 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).

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

ЗАМЕЧАНИЕ 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, за тем исключением, что её результат должен быть корректным согласно текущим языковым настройкам системы, а не быть независимым от языковых настроек. Различия будут наблюдаться лишь в некоторых случаях (например, для турецкого языка), когда правила языка противоречат стандартным регистровым отображениям Юникода.

ЗАМЕЧАНИЕ 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 Объекты типа Boolean
15.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 является объект-прототип 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.

15.7 Объекты типа Number
15.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 .

Это свойство обладает атрибутами { 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. Таким образом, она не может быть передана другим типам объектов для использования в качестве метода.

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.

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.

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.

Если метод 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.

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 - единичный объект, у которого есть несколько именованных свойств, некоторые из которых являются функциями.

Значением внутреннего свойства [[Prototype]] объекта Math является объект-прототип Object (15.2.3.1). Значением внутреннего свойства [[Class]] объекта Math является "Math".

У объекта Math нет свойства [[Construct]]. Объект Math невозможно использовать в качестве конструктора с оператором new.

У объекта Math нет свойства [[Call]]. Объект Math невозможно вызвать как функцию.

ЗАМЕЧАНИЕ
В данной спецификации фраза "численное значение x" имеет техническое значение, определённое в разделе 8.5.

15.8.1 Свойства-значения объекта Math
15.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 }.

ЗАМЕЧАНИЕ

Значение 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 (fdlibm-comment@sunpro.eng.sun.com). Также данная спецификация требует определённых результатов для определённых значений аргументов, представляющих граничные случаи, заслуживающие особого рассмотрения.

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 - результат равен зависящему от реализации приближению +?/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).

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 для каждого из аргументов, возвращает наибольшее из результирующих значений.

  • Если аргументов не передано, результатом является -?.
  • Если любое из значений равно 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, выбранное случайным или псевдослучайным образом с примерно однородным распределением по вышеописанному диапазону с использованием зависящего от реализации алгоритма или стратегии. Эта функция не принимает аргументов.

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.
  • Если x равно +? или -? - результат равен NaN.
15.9 Объекты типа Date
15.9.1 Общие сведения об объектах типа Date и определения внутренних операторов

Объект Date содержит число, обозначающее определённый момент времени с точностью до миллисекунды. Число может также равняться NaN. Это значит, что объект типа Date не обозначает определённого момента времени.

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

15.9.1.1 Временной диапазон

Время в ECMAScript измеряется в миллисекундах с 1 января 1970 года по UTC (универсальному кодированному времени - т.е. по Гринвичу). Високосные секунды не принимаются во внимание. Предполагается, что в каждом дне ровно 86,400,000 миллисекунд. Численные значения ECMAScript могут представлять все целые числа от -9 007 199 254 740 991 до 9 007 199 254 740 991. Этот диапазон достаточен для измерения времени с миллисекундной точностью для любого момента в диапазоне 285 616 лет в обе стороны относительно 1 января 1970 года.

Действительный диапазон моментов времени, разрешённый для использования в объектах ECMAScript типа Date, немного меньше: ровно от -100 000 000 дней до +100 000 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

Все невисокосные года содержат 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
  = ДатаДляВремени(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 может использовать вместо интересующего её года эквивалентный ему год (та же високосность и тот же начальный день недели), для которого среда может предоставить информацию по летнему времени. Единственным требованием является то, что все эквивалентные годы должны давать один и тот же результат.

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).

6. Вычислить Результат(2) * мсВЧасе + Результат(3) * мсВМинуте + Результат(4) * мсВСекунде + Результат(5), выполняя арифметические действия согласно правилам IEEE 754 (т. е. аналогично использованию операторов 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.

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.

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).

Кроме внутренних свойств и свойства 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.

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()

Эта функция возвращает строковое значение. Содержимое строки зависит от реализации, но должно представлять часть значения объекта типа 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.

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.

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 - данное значение времени.

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)).

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)).

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.

Свойство 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)).

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.

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 было указано значение 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 применяет к входной строке-шаблону следующую грамматику. Если грамматика не может расшифровать строку как нетерминал Шаблон, выдаётся ошибка.

Синтаксис

Шаблон ::
Дизъюнкция
Дизъюнкция ::
Альтернатива
Альтернатива | Дизъюнкция
Альтернатива ::
[пусто]
Альтернатива Элемент
Элемент ::
Проверка
Атом
Атом ПризнакКоличества
Проверка ::
^
$
\b
\B
ПризнакКоличества ::
ПрефиксПризнакаКоличества
ПрефиксПризнакаКоличества ?
ПрефиксПризнакаКоличества ::
*
+
?
{ ДесятичныеЦифры }
{ ДесятичныеЦифры ,}
{ ДесятичныеЦифры , ДесятичныеЦифры }
Атом ::
СимволШаблона
.
\ EscapeАтом
КлассСимволов
( Дизъюнкция )
(?: Дизъюнкция )
(?= Дизъюнкция )
(?! Дизъюнкция )
СимволШаблона ::
ИсходныйСимвол но не один из: ^ $ \ . * + ? ( ) [ ] { } |
ДесятичнаяEscapeАтом ::
ДесятичнаяEscape
СимвольнаяEscape
EscapeКлассаСимвола
СимвольнаяEscape ::
УправляющаяEscape
c УправляющийСимвол
ШестнадцатеричнаяEscapeПоследовательность
ЮникоднаяEscapeПоследовательность
EscapeИдентификатора
Управляющая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 Семантика шаблонов

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

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. Сличитель пытается найти соответствие для средней части шаблона (определённой уже привязанными аргументами замыкания) во входной строке, начиная с промежуточного состояния, определённого его аргументом Состояние. Аргумент Продолжение должен равняться замыканию, которое ищет соответствие для оставшейся части шаблона. После поиска соответствия для подшаблона шаблона и получения нового Состояния, искатель вызывает Продолжение для этого состояния, чтобы проверить, находится ли соответствие для оставшейся части шаблона. Если оно находится, сличитель возвращает состояние, возвращённое продолжением. В противном случае сличитель может попробовать другие варианты в своих точках ветвления, последовательно вызывая Продолжение, пока либо оно вернёт положительный результат, либо все возможности будут исчерпаны.
  • Функция ПроверщикУсловия является внутренним замыканием, принимающим аргумент Состояние и возвращающим булевский результат. Проверщик условия проверяет выполнение некоторого условия (определённого уже привязанными аргументами замыкания) в некотором месте входной строки и возвращает 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. С другой стороны, как только шаблон был успешно скомпилирован, применение результирующей функции для нахождения соответствия в строке не может бросить исключения (кроме некоторых исключений среды, которые могут возникнуть в любом месте - например, нехватка памяти).

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).

Значение нетерминала Альтернатива :: Альтернатива Элемент вычисляется по следующей схеме:

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 - число захватывающих скобок во всём регулярном выражении, которые встретились слева от символов, распознанных данным грамматическим правилом как Элемент. Оно равно сумме общего количества раз, когда правило Атом :: ( Дизъюнкция ) было применено до Элемента текущего правила, и общего количества раз, которые правила Атом :: ( Дизъюнкция ) окружают данный Элемент.

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.

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 СличителяПовторов очищает массив захваченных значений Атома каждый раз, когда Атом повторяется. Это поведение может быть продемонстрировано регулярным выражением

/(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, и производит следующие действия:

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
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 Атом

Значение нетерминала Атом :: СимволШаблона вычисляется по следующей схеме:

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) и вернуть результат вызова. Значение нетерминала Атом :: (?: Дизъюнкция ) вычисляется путём вычисления значения Дизъюнкции и возврата результирующего Сличителя.

Значение нетерминала Атом :: (?= Дизъюнкция ) вычисляется по следующей схеме:

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.

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). Это влияет на результат только в том случае, когда Дизъюнкция содержит захватывающие скобки, на которые потом ссылается остаток регулярного выражения.

Например,

/(?=(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.

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.

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 - МЗ ДесятичногоЦелогоЛитерала.

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 ДиапазоныКласса

Значение нетерминала ДиапазоныКласса :: [пусто] вычисляется путём возврата пустого НабораСимволов.

Значение нетерминала ДиапазоныКласса :: НепустыеДиапазоныКласса вычисляется путём вычисления значения НепустыеДиапазоныКласса и возврата полученного НабораСимволов.

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 НепустыеДиапазоныКлассаБезТире

Значение нетерминала НепустыеДиапазоныКлассаБезТире :: АтомКласса вычисляется путём вычисления значения АтомаКласса и возврата полученного НабораСимволов.

Значение нетерминала НепустыеДиапазоныКлассаБезТире :: АтомКлассаБезТире НепустыеДиапазоныКлассаБезТире вычисляется по следующей схеме:

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 АтомКлассаБезТире

Значение нетерминала АтомКлассаБезТире :: ИсходныйСимвол но не один из \ ] - вычисляется путём возврата множества символов, содержащего единственный элемент ИсходныйСимвол.

Значение нетерминала АтомКлассаБезТире :: \ 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 равно 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]] объекта-прототипа 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, на которой нашлась подстрока-соответствие.
  • Свойство 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 }.

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

Значением внутреннего свойства [[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

Указывает, что численное значение вышло за пределы допустимого диапазона. См. разделы 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 как функции

Когда NativeError вызывается не как конструктор, а как функция, он создаёт и инициализирует новый объект. Таким образом, вызов объекта как функции эквивалентен вызову его как конструктора с теми же аргументами.

15.11.7.2 NativeError (message)

Свойство [[Prototype]] создаваемого объекта устанавливается в объект-прототип для данного конструктора ошибки. Свойство [[Class]] создаваемого объекта устанавливается в "Error".

Если аргумент message не равен undefined, свойство message создаваемого объекта устанавливается в ToString(message).

15.11.7.3 Конструкторы NativeError

Когда конструктор 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.

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, реализация должна позволить непрямое использование 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
Комментарий ::
МногострочныйКомментарий
ОднострочныйКомментарий
См. 7.4
МногострочныйКомментарий ::
/* СимволыМногострочногоКомментарияопц */
См. 7.4
СимволыМногострочногоКомментария ::
МногострочныйСимвНеЗвёздочка СимволыМногострочногоКомментарияопц
* СимволыКомментарияПослеЗвёздочкиопц
См. 7.4
СимволыКомментарияПослеЗвёздочки ::
МногострочныйСимвНеСлэшИлиЗвёздочка СимволыМногострочногоКомментарияопц
* СимволыКомментарияПослеЗвёздочкиопц
См. 7.4
МногострочныйСимвНеЗвёздочка ::
ИсходныйСимвол но не звёздочка *
См. 7.4
МногострочныйСимвНеСлэшИлиЗвёздочка ::
ИсходныйСимвол но не прямой слэш / или звёздочка *
См. 7.4
ОднострочныйКомментарий ::
// СимволыОднострочногоКомментарияопц
См. 7.4
СимволыОднострочногоКомментария ::
СимволОднострочногоКомментария СимволыОднострочногоКомментарияопц
См. 7.4
СимволОднострочногоКомментария ::
ИсходныйСимвол но не КонецСтроки
См. 7.5
Токен ::
ЗарезервированноеСлово
Идентификатор
ЗнакПрепинания
ЧисловойЛитерал
СтроковойЛитерал
См. 7.5.1
ЗарезервированноеСлово ::
КлючевоеСлово
ЗарезервированноеНаБудущееСлово
ЛитералNull
БулевскийЛитерал
См. 7.5.2
КлючевоеСлово :: одно из
break else new var case finally return void catch for switch while continue function this 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 char final native synchronized class float package throws const goto private transient debugger 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
СоединяющаяПунктуацияЮникода
любой символ из категории Юникода "Соединяющая пунктуация (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
ДесятичныйЦелыйЛитерал ::
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.4
SingleStringCharacter ::
ИсходныйСимвол но не одиночная-кавычка ' или обратный-слэш \или КонецСтроки
\ EscapeПоследовательность
См. 7.8.4
EscapeПоследовательность ::
СимвольнаяEscapeПоследовательность
0 [предпросмотр ∉ ДесятичнаяЦифра]
ШестнадцатеричнаяEscapeПоследовательность
ЮникоднаяEscapeПоследовательность
См. 7.8.4
СимвольнаяEscapeПоследовательность ::
ОдиночныйEscapeСимвол
НеEscapeСимвол
См. 7.8.4
ОдиночныйEscapeСимвол :: один из
' " \ b f n r t v
См. 7.8.4
EscapeСимвол ::
Одиночный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
СимволРегулярногоВыражения ::
НеОкончание но не\ или /
ПоследовательностьОбрСлэш
См. 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
СтрБеззнаковыйДесятичныйЛитерал :::
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
ЛитералМассива :
[ Пропускопц ]
[ СписокЭлементов ]
[ СписокЭлементов , Пропускопц ]
См. 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
Аргументы :
()
( СписокАргументов )
См. 11.2
СписокАргументов :
ВыражениеПрисваивания
СписокАргументов , ВыражениеПрисваивания
См. 11.2
ЛевостороннееВыражение :
ВыражениеNew
ВыражениеCall
См. 11.3
ПостфиксноеВыражение :
ЛевостороннееВыражение
ЛевостороннееВыражение [здесь нет КонцаСтроки] ++
ЛевостороннееВыражение [здесь нет КонцаСтроки] --
См. 11.4
УнарноеВыражение :
ПостфиксноеВыражение
delete УнарноеВыражение
void УнарноеВыражение
typeof УнарноеВыражение
++ УнарноеВыражение
-- УнарноеВыражение
+ УнарноеВыражение
- УнарноеВыражение
~ УнарноеВыражение
! УнарноеВыражение
См. 11.5
МультипликативноеВыражение :
УнарноеВыражение
МультипликативноеВыражение * УнарноеВыражение
МультипликативноеВыражение / УнарноеВыражение
МультипликативноеВыражение % УнарноеВыражение
См. 11.6
АддитивноеВыражение :
МультипликативноеВыражение
АддитивноеВыражение + МультипликативноеВыражение
АддитивноеВыражение - МультипликативноеВыражение
См. 11.7
ВыражениеСдвига :
АддитивноеВыражение
ВыражениеСдвига << ВыражениеСдвига
ВыражениеСдвига >> АддитивноеВыражение
ВыражениеСдвига >>> АддитивноеВыражение
См. 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
ВыражениеПобитовогоИскИЛИБез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 :
УсловноеВыражениеБез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
СписокОбъявленияПеременных :
ОбъявлениеПеременной
СписокОбъявленияПеременных , ОбъявлениеПеременной
См. 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
Инструкция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.13
ThrowStatement :
throw [здесь нет КонцаСтроки] Выражение ;
См. 12.14
ИнструкцияTry :
try Блок Catch
try Блок Finally
try Блок Catch Finally
См. 12.14
Catch :
catch (Идентификатор ) Блок
См. 12.14
Finally :
finally Блок
A.5 Функции и программы
См. раздел 13
ОбъявлениеФункции :
function Идентификатор ( СписокФормальныхАргументовопц ){ ТелоФункции }
См. раздел 13
ВыражениеФункции :
function Идентификаторопц ( СписокФормальныхАргументовопц ){ ТелоФункции }
См. раздел 13
СписокФормальныхАргументов :
Идентификатор
СписокФормальныхАргументов , Идентификатор
См. раздел 13
ТелоФункции :
ЭлементыИсходногоКода
См. раздел 14
Программа :
ЭлементыИсходногоКода
См. раздел 14
ЭлементыИсходногоКода :
ЭлементИсходногоКода
ЭлементыИсходногоКода ЭлементИсходногоКода
См. раздел 14
ЭлементИсходногоКода :
Инструкция
ОбъявлениеФункции
A.6 Классы символов URI
См. 15.1.3
uri :::
uriСимволыопц
См. 15.1.3
символыUri :::
символUri символыUriопц
См. 15.1.3
символUri :::
uriЗарезервированный
uriНеэкранированный
uriЭкранированный
См. 15.1.3
uriЗарезервированный ::: один из
; / ? : @ & = + $ ,
См. 15.1.3
uriНеэкранированный :::
uriБуква
ДесятичнаяЦифра
uriЗнак
См. 15.1.3
uriЭкранированный :::
% ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра
См. 15.1.3
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
См. 15.1.3
uriЗнак ::: один из
- _ . ! ~ * ' ( )
A.7 Регулярные выражения
См. 15.10.1
Шаблон ::
Дизъюнкция
См. 15.10.1
Дизъюнкция ::
Альтернатива
Альтернатива | Дизъюнкция
См. 15.10.1
Альтернатива ::
[пусто]
Альтернатива Элемент
См. 15.10.1
Элемент ::
Проверка
Атом
Атом ПризнакКоличества
См. 15.10.1
Проверка ::
^
$
\ b
\ B
См. 15.10.1
ПризнакКоличества ::
ПрефиксПризнакаКоличества
ПрефиксПризнакаКоличества ?
См. 15.10.1
ПрефиксПризнакаКоличества ::
*
+
?
{ ДесятичныеЦифры }
{ ДесятичныеЦифры ,}
{ ДесятичныеЦифры , ДесятичныеЦифры }
См. 15.10.1
Атом ::
СимволШаблона
.

\ EscapeАтом
КлассСимволов
( Дизъюнкция )
(?: Дизъюнкция )
(?= Дизъюнкция )
(?! Дизъюнкция )

См. 15.10.1
СимволШаблона ::ИсходныйСимвол но не один из:
^ $ \ . * + ? ( ) [ ] { } |
См. 15.10.1
EscapeАтом ::
ДесятичнаяEscape
СимвольнаяEscape
EscapeКлассаСимвола
См. 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
См. 15.10.1
EscapeИдентификатора ::
ИсходныйСимвол но не ЧастьИдентификатора
См. 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.1
EscapeКласса ::
ДесятичнаяEscape
b
СимвольнаяEscape
EscapeКлассаСимвола


Приложение B

Приложение B
(информативное)
Совместимость
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 могут быть расширены согласно следующему описанию:

Синтаксис

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 включили дополнительные свойства для стандартных встроенных объектов. Это ненормативное приложение предлагает единую семантику для таких свойств, при этом не включая эти свойства в качестве части стандарта.

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.

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.

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".

Когда метод 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	ИнструкцияWith
AssignmentExpression	ВыражениеПрисваивания
ArgumentList	СписокАргументов
Identifier	Идентификатор
Initialiser	Инициализатор
ExpressionNoIn	ВыражениеБезIn
DecimalDigit	ДесятичнаяЦифра
DecimalDigits	ДесятичныеЦифры
LookaheadExample	ПримерПредпросмотра
LineTerminator	КонецСтроки
NonZeroDigit	НенулеваяЦифра
IdentifierName	ИмяИдентификатора
SourceCharacter	ИсходныйСимвол
WhiteSpace	Пробел
Comment	Комментарий
SingleLineComment	ОднострочныйКомментарий
MultiLineCommentChars	СимволыМногострочногоКомментария
MultiLineNotAsteriskChar	МногострочныйСимвНеЗвёздочка
PostAsteriskCommentChars	СимволыКомментарияПослеЗвёздочки
MultiLineNotForwardSlashOrAsteriskChar	МногострочныйСимвНеСлэшИлиЗвёздочка
SingleLineCommentChars	СимволыОднострочногоКомментария
SingleLineCommentChar	СимволОднострочногоКомментария
Token	Токен
Punctuator	ЗнакПрепинания
NumericLiteral	ЧисленныйЛитерал
StringLiteral	СтроковойЛитерал
ReservedWord	ЗарезервированноеСлово
Keyword	КлючевоеСлово
FutureReservedWord	ЗарезервированноеНаБудущееСлово
NullLiteral	ЛитералNull
BooleanLiteral	БулевскийЛитерал
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	ИнструкцияContinue
BreakStatement	ИнструкцияBreak
ThrowStatement	ИнструкцияThrow
ReturnStatement	ИнструкцияReturn
PropertyName	ИмяСвойства
StringNumericLiteral	СтроковойЧисленныйЛитерал
StrWhiteSpace	СтрПробелов
StrNumericLiteral	СтрЧисленныйЛитерал
StrWhiteSpaceChar	СтрСимвПробела
StrDecimalLiteral	СтрДесятичныйЛитерал
StrUnsignedDecimalLiteral	СтрБеззнаковыйДесятичныйЛитерал
FunctionDeclaration	ОбъявлениеФункции
FunctionExpression	ВыражениеФункции
FunctionBody	ТелоФункции
FormalParameterList	СписокФормальныхАргументов
VariableDeclaration	ОбъявлениеПеременной
VariableDeclarationNoIn	ОбъявлениеПеременнойБезIn
PrimaryExpression	ПервичноеВыражение
ArrayLiteral	ЛитералМассива
ObjectLiteral	ЛитералОбъекта
Elision	Пропуск
ElementList	СписокЭлементов
PropertyNameAndValueList	СписокИмёнСвойствИЗначений
MemberExpression	ВыражениеЭлемента
Arguments	Аргументы
NewExpression	ВыражениеNew
CallExpression	ВыражениеCall
UnaryExpression	УнарноеВыражение
MultiplicativeExpression	МультипликативноеВыражение
AdditiveExpression	АддитивноеВыражение
ShiftExpression	ВыражениеСдвига
RelationalExpression	ВыражениеОтношения
RelationalExpressionNoIn	ВыражениеОтношенияБезIn
EqualityExpression	ВыражениеРавенства
EqualityExpressionNoIn	ВыражениеРавенстваБезIn
BitwiseANDExpression	ВыражениеПобитовогоИ
BitwiseANDExpressionNoIn	ВыражениеПобитовогоИБезIn
BitwiseXORExpression	ВыражениеПобитовогоИскИЛИ
BitwiseXORExpressionNoIn	ВыражениеПобитовогоИскИЛИБезIn
BitwiseORExpression	ВыражениеПобитовогоИЛИ
BitwiseORExpressionNoIn	ВыражениеПобитовогоИЛИБезIn
LogicalANDExpression	ВыражениеЛогическогоИ
LogicalANDExpressionNoIn	ВыражениеЛогическогоИБезIn
LogicalORExpression	ВыражениеЛогическогоИЛИ
LogicalORExpressionNoIn	ВыражениеЛогическогоИЛИБезIn
ConditionalExpression	УсловноеВыражение
ConditionalExpressionNoIn	УсловноеВыражениеБезIn
AssignmentExpressionNoIn	ВыражениеПрисваиванияБезIn
AssignmentOperator	ОператорПрисваивания
Block	Блок
VariableStatement	ИнструкцияПеременной
EmptyStatement	ПустаяИнструкция
ExpressionStatement	ИнструкцияВыражение
IfStatement	ИнструкцияIf
IterationStatement	ИнструкцияИтерации
LabelledStatement	ИнструкцияСМеткой
SwitchStatement	ИнструкцияSwitch
TryStatement	ИнструкцияTry
StatementList	СписокИнструкций
VariableDeclarationList	СписокОбъявленияПеременных
VariableDeclarationListNoIn	СписокОбъявленияПеременныхБезIn
InitialiserNoIn	ИнициализаторБезIn
EmptyStatement	ПустаяИнструкция
CaseBlock	БлокCase
CaseClauses	ВетвиCase
CaseClause	ВетвьCase
DefaultClause	ВетвьПоУмолчанию
Catch	Catch
Finally	Finally
SourceElements	ЭлементыИсходногоКода
Scope	ОбластьВидимости
SourceElement	ЭлементИсходногоКода
uri	uri
uriCharacters	символыUri
uriCharacter	символUri
uriReserved	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	Альтернатива
Term	Элемент
Assertion	Проверка
Atom	Атом
Quantifier	ПризнакКоличества
QuantifierPrefix	ПрефиксПризнакаКоличества
PatternCharacter	СимволШаблона
AtomEscape	EscapeАтом
CharacterClass	КлассСимволов
DecimalEscape	ДесятичнаяEscape
CharacterEscape	СимвольнаяEscape
CharacterClassEscape	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)