Спецификация ECMAScript 5.1 с аннотациями

Поделиться

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

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

Если не указано иначе, стандартные встроенные свойства глобального объекта имеют атрибуты {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}.

Глобальный объект не имеет встроенного свойства [[Construct]]. Использование глобального объекта в качества конструктора с оператором new невозможно.

Глобальный объект не имеет внутреннего свойства [[Call]]. Вызов глобального объекта в качестве функции невозможен.

Значения внутренних свойств [[Prototype]] и [[Class]] глобального объекта зависят от реализации.

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

15.1.1 Свойства-значения Глобального объекта #

15.1.1.1 NaN (не-число) #

Значение свойства NaN равно NaN (см. пункт 8.5). Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.1.1.2 Infinity (бесконечность) #

Значение свойства Infinity равно + (см. пункт 8.5). Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.1.1.3 undefined (неопределено) #

Значение свойства undefined равно undefined (см. пункт 8.1). Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.1.2 Свойства-функции Глобального объекта #

15.1.2.1 eval (x) #

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

  1. Если Type(x) не равно String, вернуть x.

  2. Пусть prog будет кодом на ECMAScript, который является результатом синтаксического разбора x как Программы. Если выполнение этого разбора не удалось, сгенерировать исключение SyntaxError (при этом см. Главу 16).

  3. Пусть evalCtx будет результатом установления нового контекста исполнения (10.4.2) для prog с eval-кодом.

  4. Пусть result будет результатом вычисления программы prog.

  5. Выйти из текущего контекста исполнения evalCtx, восстановив предыдущий контекст исполнения.

  6. Если result.type равен normal и его значение completion равно значению V, вернуть значение V.

  7. Если result.type равен normal и его значение completion равно empty, вернуть значение undefined.

  8. Иначе, result.type должен быть throw. Сгенерировать result.value в качестве исключения.

15.1.2.1.1 Прямой вызов функции Eval #

Прямой вызов функции eval – вызов, который выражен как CallExpression Выражение call и выполняет два условия:

У Reference, который является результатом выполнения MemberExpression Выражение элемента в CallExpression, запись окружения используется в качестве значения базы, а имя по ссылке – "eval".

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

15.1.2.2 parseInt (string , radix) #

Функция parseInt возвращает целочисленное значение, обусловленное интерпретацией содержимого аргумента string в соответствии с заданным radix основание системы счисления. Начальные пробелы в строке string игнорируются. Если radix равно undefined или 0, предполагается, что основание системы счисления – 10, кроме случаев, когда число начинается с пары символов 0x или 0X – в этом случае предполагается, что основание системы счисления равно 16. Если radix равно 16, число также может начинаться с пары символов 0x или 0X (не обязательно).

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

  1. Пусть inputString будет ToString(string).

  2. Пусть S будет новой подстрокой от inputString, состоящей из первого символа, не являющегося StrWhiteSpaceChar, и всех символов, следующих за ним. (Иными словами – удалить начальный пробел). Если inputString не содержит таких символов, пусть S будет пустой строкой.

  3. Пусть sign будет 1.

  4. Если S не пустая строка, и первый символ S – знак минус -, пусть sign будет 1.

  5. Если S не пустая строка, и первый символ S – знак плюс + или знак минус -, то удалить из S этот первый символ.

  6. Пусть R = ToInt32(radix).

  7. Пусть stripPrefix будет true.

  8. Если R 0, то

    1. Если R < 2 or R > 36, то вернуть NaN.

    2. если R 16, пусть stripPrefix будет false.

  9. Иначе R = 0

    1. Пусть R = 10.

  10. Если stripPrefix равно true, то

    1. Если длина S равна не менее 2, и первые два символа S – либо “0x”, либо “0X”, то удалить из S первые два символа, и пусть R = 16.

  11. Если S содержит символ, не являющийся числом в системе счисления с основанием R, то пусть Z будет подстрокой от S, состоящей из всех символов до первого такого символа; иначе пусть Z будет S.

  12. Если Z равно empty, вернуть NaN.

  13. Пусть mathInt будет целочисленным математическим значением, представленным подстрокой Z, записанной в системе счисления с основанием R, с использованием букв от A до Z и от a до z для чисел со значениями от 10 до 35. (Однако, если R равно 10, и Z содержит более 20 значащих цифр, то каждая значащая цифра после 20-й может быть заменена цифрой 0 – по выбору реализации; и если R не равно 2, 4, 8, 10, 16 или 32, то mathInt может быть зависящим от реализации приближением к математическому целочисленному значению, представленному посредством Z в radix-R notation.)

  14. Пусть number будет числовым значением для mathInt.

  15. Вернуть sign × number.

ПРИМЕЧАНИЕ Функция parseInt может интерпретировать только начальную часть строки string как целочисленное значение. Она игнорирует все символы, которые не могут быть интерпретированы как часть записи целого числа, при этом уведомление об игнорировании этих символов отсутствует.

15.1.2.3 parseFloat (string) #

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

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

  1. Пусть inputString будет ToString(string).

  2. Пусть trimmedString будет подстрокой от inputString, состоящей из крайнего левого символа, не являющегося StrWhiteSpaceChar, и всех символов справа от него. (Иными словами – удалить начальный пробел). Если inputString не содержит таких символов, пусть trimmedString будет пустой строкой.

  3. Если ни trimmedString, ни какой-либо из его префиксов не удовлетворяет синтаксису строкового числового литерала StrDecimalLiteral (см. пункт 9.3.1), вернуть NaN.

  4. Пусть numberString будет самым длинным префиксом trimmedString (которым может быть сама подстрока trimmedString), удовлетворяющим синтаксису для StrDecimalLiteral.

  5. Вернуть числовой значение для MV для numberString.

ПРИМЕЧАНИЕ Функция parseFloat может интерпретировать только начальную часть строки string как числовое значение. Она игнорирует все символы, которые не могут быть интерпретированы как часть записи десятичного литерала, при этом уведомление об игнорировании этих символов отсутствует.

15.1.2.4 isNaN (number) #

Возвращает true, если аргумент может быть приведён к NaN, в противном случае возвращает false.

  1. Если ToNumber(number) равно NaN, вернуть true.

  2. В противном случае вернуть false.

ПРИМЕЧАНИЕ Надёжный способ для кода на ECMAScript проверить, является ли X равным NaN – выражение в виде X !== X. Результат будет равен true только в том случае, если X равно NaN.

15.1.2.5 isFinite (number) #

Возвращает false, если аргумент может быть приведён к NaN, + или −∞, в противном случае возвращает true.

  1. Если ToNumber(number) равно NaN, + или −∞, вернуть false.

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

Scheme : First / Second ; Third ? Fourth

где названия, написанные курсивом, обозначают компоненты, а знаки “:”, “/”, “;” и “?” являются зарезервированными символами, используемыми в качестве разделителей. Функции encodeURI и decodeURI предназначены для работы с целыми URI. Они допускают, что все зарезервированные символы в URI должны иметь специальное значение и поэтому не кодируются. Функции encodeURIComponent и decodeURIComponent предназначены для работы с отдельными компонентами URI. Они допускают, что все зарезервированные символы представляют собой текст и поэтому должны быть закодированы, чтобы в том случае, если этот компонент является частью полного URI, они не трактовались бы как зарезервированные символы.

Формат закодированных URI определяется следующей лексической грамматикой:

uri :::

uriCharactersopt

uriCharacters :::

uriCharacter uriCharactersopt

uriCharacter :::

uriReserved
uriUnescaped
uriEscaped

uriReserved ::: один из

; / ? : @ & = + $ ,

uriUnescaped :::

uriAlpha
DecimalDigit
uriMark

uriEscaped :::

% HexDigit HexDigit

uriAlpha ::: один из

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

uriMark ::: один из

- _ . ! ~ * ' ( )

ПРИМЕЧАНИЕ Вышеприведённый синтаксис указан в соответствии с документом RFC 2396 и не отражает изменений, появившихся в более позднем документе RFC 3986.

Если в вышеуказанном списке нет символа, который нужно написать в URI, или если этот символ не имеет специального значения, иногда приписываемого зарезервированным символам, необходимо закодировать этот символ. Этот символ преобразуется в соответствии с кодировкой UTF-8, при этом сначала суррогатные пары преобразуются из формата UTF-16 в соответствующее значение кодовой точки. (Обратите внимание, что для кодовых единиц в диапазоне [0,127] результатом будет являться единичный октет с тем же значением.) Затем полученная в результате последовательность октетов преобразуется в строку, где каждый октет представлен управляющей последовательностью в виде "%xx".

Процесс кодирования и выхода описан абстрактной операцией Encode, которая принимает два строковых аргумента string и unescapedSet.

  1. Пусть strLen будет количеством символов в string.

  2. Пусть R будет пустой строкой.

  3. Пусть k будет 0.

  4. Повторить

    1. Если k равно strLen, вернуть R.

    2. Пусть C будет символом в позиции k в пределах string.

    3. Если C находится в unescapedSet, то

      1. Пусть S будет строкой, содержащей только символ C.

      2. Пусть R будет новым строковым значением, полученным в результате конкатенации S с предыдущим значением R.

    4. Иначе C не является unescapedSet

      1. Если кодовое значение C не меньше 0xDC00 и не больше 0xDFFF, сгенерировать исключение URIError.

      2. Если кодовое значение C меньше 0xD800 или больше 0xDBFF, то

        1. Пусть V будет кодовым значением C.

      3. Иначе

        1. Увеличить k на 1.

        2. Если k равно strLen, сгенерировать исключение URIError.

        3. Пусть kChar будет кодовым значением символа в позиции k в пределах string.

        4. Если kChar меньше 0xDC00 или больше 0xDFFF, сгенерировать исключение URIError.

        5. Пусть V будет (((кодовое значение C) – 0xD800) * 0x400 + (kChar – 0xDC00) + 0x10000).

      4. Пусть Octets будет массивом октетов, полученным в результате применения к V преобразования в кодировке UTF-8, и пусть L будет размером массива.

      5. Пусть j будет 0.

      6. Повторить, пока j < L

        1. Пусть jOctet будет значением в позиции j в пределах Octets.

        2. Пусть S будет строкой, содержащей три символа “%XY”, где XY – две шестнадцатеричные цифры в верхнем регистре, которые кодируют значение jOctet.

        3. Пусть R будет новым строковым значением, полученным в результате конкатенации S с предыдущим значением R.

        4. Увеличить j на 1.

    5. Увеличить k на 1.

Процесс возврата и декодирования описан абстрактной операцией Decode, принимающей два строковых аргумента string и reservedSet.

  1. Пусть strLen будет количеством символов в string.

  2. Пусть R будет пустой строкой.

  3. Пусть k будет 0.

  4. Повторить

    1. Если k равно strLen, вернуть R.

    2. Пусть C будет символом в позиции k в пределах string.

    3. Если C не равно ‘%’, то

      1. Пусть S будет строкой, содержащей только символ C.

    4. Иначе, пусть C будет ‘%

      1. Пусть start будет k.

      2. Если k + 2 больше или равно strLen, сгенерировать исключение URIError.

      3. Если символы (k+1) и (k + 2) в пределах string не являются шестнадцатеричными цифрами, сгенерировать исключение URIError.

      4. Пусть B будет 8-битовым значением, представленным двумя шестнадцатеричными цифрами в позиции (k + 1) и (k + 2).

      5. Увеличить k на 2.

      6. Если старший бит в B равен 0, то

        1. Пусть C будет символом с кодовым значением B.

        2. Если C не находится в reservedSet, то

          1. Пусть S будет строкой, содержащей только символ C.

        3. Иначе, C находится в reservedSet

          1. Пусть S будет подстрокой строки string с позиции start до позиции k включительно.

      7. Иначе, старший бит в B равен 1

        1. Пусть n будет таким наименьшим неотрицательным числом, чтобы (B << n) & 0x80 было равно 0.

        2. Если n равно 1, или n больше чем 4, сгенерировать исключение URIError.

        3. Пусть Octets будет массивом 8-битовых целых чисел, размер которого составляет n.

        4. Поместить B в Octets в позицию 0.

        5. Если k + (3 * (n – 1)) больше или равно strLen, сгенерировать исключение URIError.

        6. Пусть j будет 1.

        7. Повторить, пока j < n

          1. Увеличить k на 1.

          2. Если символ в позиции k не является ‘%’, сгенерировать исключение URIError.

          3. Если символы (k+1) и (k + 2) в пределах string не являются шестнадцатеричными цифрами, сгенерировать исключение URIError.

          4. Пусть B будет 8-битовым значением, представленным двумя шестнадцатеричными цифрами в позиции (k + 1) и (k + 2).

          5. Если два старших бита в B не равны 10, сгенерировать исключение URIError.

          6. Увеличить k на 2.

          7. Поместить B в Octets в позицию j.

          8. Увеличить j на 1.

        8. Пусть V будет значением, полученным в результате применения к Octets преобразования в кодировке UTF-8, то есть, из массива октетов в 32-битовое значение. Если Octets не содержит действующей кодировки UTF-8 юникодной кодовой точки, сгенерировать исключение URIError .

        9. Если V меньше 0x10000, то

          1. Пусть C будет символом с кодовым значением V.

          2. Если C не находится в reservedSet, то

            1. Пусть S будет строкой, содержащей только символ C.

          3. Иначе, C находится в reservedSet

            1. Пусть S будет подстрокой строки string с позиции start до позиции k включительно.

        10. Иначе, V равно ≥ 0x10000

          1. Пусть L будет (((V – 0x10000) & 0x3FF) + 0xDC00).

          2. Пусть H будет ((((V – 0x10000) >> 10) & 0x3FF) + 0xD800).

          3. Пусть S будет строкой, содержащей два символа с кодовыми значениями H и L.

    5. Пусть R будет новым строковым значением, полученным в результате конкатенации S с предыдущим значением R.

    6. Увеличить k на 1.

ПРИМЕЧАНИЕ Синтаксис Унифицированных идентификаторов ресурса указан в соответствии с документом RFC 2396 и не отражает изменений, появившихся в более позднем документе RFC 3986, заменившем RFC 2396. Формальное описание и реализация UTF-8 указаны в RFC 3629.

В формате UTF-8 символы кодируются последовательностями от 1 до 6 октетов. Если последовательность состоит из одного октета, то в ней старший бит установлен в 0, а оставшиеся 7 битов используются для кодирования значения символа. Если последовательность состоит из n октетов, где n>1, то у первого октета n старших битов установлены в 1, после которых следует бит, установленный в 0. Остальные биты этого октета содержат биты значения кодируемого символа. У всех следующих октетов старший бит установлен в 1, следующий за ним бит установлен в 0, а остальные 6 битов содержат биты кодируемого символа. Возможные варианты кодировки UTF-8 символов ECMAScript указаны в Таблице 21.

Таблица 21. Кодировки 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 "Суррогаты" Стандарта Юникода.

Для кодирования суррогатных пар используется диапазон кодовых значений 0xD800-0xDFFF. Упомянутое преобразование комбинирует суррогатную пару в кодировке UTF-16 в представление в кодировке UTF-32, и затем кодируют полученное 21-битовое значение в UTF-8. При декодировании суррогатная пара восстанавливается.

Документ RFC 3629 запрещает декодирование некорректных последовательностей октета в кодировке UTF-8. Например, некорректная последовательность C0 80 не должна декодироваться в символ U+0000. При обнаружении таких некорректных последовательностей алгоритм декодирования должен генерировать URIError.

15.1.3.1 decodeURI (encodedURI) #

Функция decodeURI вычисляет новую версию URI, в которой каждая управляющая последовательность и кодировка UTF-8, которые могут быть введены посредством функции encodeURI, заменяются символом, который они представляют. Управляющие последовательности, которые не могут быть введены посредством функици encodeURI, не подвергаются замене.

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

  1. Пусть uriString будет ToString(encodedURI).

  2. Пусть reservedURISet будет строкой, содержащей по одному экземпляру каждого символа, корректного в uriReserved, плюс “#”.

  3. Вернуть результат вызова Decode(uriString, reservedURISet)

ПРИМЕЧАНИЕ Символ “#” не декодируется из управляющей последовательности, хотя он не является зарезервированным символом URI.

15.1.3.2 decodeURIComponent (encodedURIComponent) #

Функция decodeURIComponent вычисляет новую версию URI, в которой каждая управляющая последовательность и кодировка UTF-8, которые могут быть введены посредством функции encodeURIComponent, заменяются символом, который они представляют.

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

  1. Пусть componentString будет ToString(encodedURIComponent).

  2. Пусть reservedURIComponentSet будет пустой строкой.

  3. Вернуть результат вызова Decode(componentString, reservedURIComponentSet)

15.1.3.3 encodeURI (uri) #

Функция encodeURI вычисляет новую версию URI, в которой все экземпляры определённых символов заменяются одной, двумя или тремя управляющими последовательностями, представляющими собой UTF-8 кодировку этого символа.

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

  1. Пусть uriString будет ToString(uri).

  2. Пусть unescapedURISet будет строкой, содержащей по одному экземпляру каждого символа, корректного в uriReserved и uriUnescaped, плюс “#”.

  3. Вернуть результат вызова Encode(uriString, unescapedURISet)

ПРИМЕЧАНИЕ Символ “#” не кодируется в управляющую последовательность, хотя он не является зарезервированным или unescaped символом URI.

15.1.3.4 encodeURIComponent (uriComponent) #

Функция encodeURIComponent вычисляет новую версию URI, в которой все экземпляры определённых символов заменяются одной, двумя или тремя управляющими последовательностями, представляющими собой UTF-8 кодировку этого символа.

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

  1. Пусть componentString будет ToString(uriComponent).

  2. Пусть unescapedURIComponentSet будет строкой, содержащей по одному экземпляру каждого символа, корректного в uriUnescaped.

  3. Вернуть результат вызова Encode(componentString, unescapedURIComponentSet)

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.1.5.2 JSON #

См. 15.12.