Javascript.RU

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

Update: Более новый материал по этой теме находится по адресу http://es5.javascript.ru.
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.


Автор: Гость (не зарегистрирован), дата: 15 декабря, 2008 - 13:41
#permalink

Автору огромное спасибо!


Автор: subzey, дата: 12 октября, 2010 - 15:58
#permalink

UTF побился — по всему тексту вместо «∞» и «π» знаки вопроса.

Особенно забавно «Результат выражен в радианах и находится в диапазоне от -?/2 до +?/2.» — от минус хрен-знает-сколько пополам, до плюс столько же.


Автор: Soiseepsy (не зарегистрирован), дата: 16 января, 2011 - 19:02
#permalink

Поздравляю вас Старо-Новым годом, желаю вам в новом году успехов и спасибо что вы находите время поддерживать ваш замечательный блог!


Автор: Гость (не зарегистрирован), дата: 12 апреля, 2022 - 21:31
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 14:29
#permalink

Автор: DorisWayne (не зарегистрирован), дата: 12 декабря, 2022 - 11:12
#permalink

очень подробная статья, она заставила меня задуматься о своих проблемах.

Scribble


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
7 + 6 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum