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

Поделиться

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

Внутреннее свойство [[Extensible]] создаваемого объекта устанавливается равным true.

Внутреннее свойство [[PrimitiveValue]] создаваемого объекта устанавливается равным 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).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

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

15.5.4.1 String.prototype.constructor #

Начальным значением String.prototype.constructor является встроенный конструктор String.

15.5.4.2 String.prototype.toString ( ) #

Возвращает строковое значение. (Обратите внимание, что для объекта String метод toString возвращает то же значение, что и метод valueOf.)

Функция toString не является родовой функцией. Если её значение this – не строка или не объект String, она генерирует исключение TypeError. Поэтому она не может передаваться другим типам объектов для использования в качестве метода.

15.5.4.3 String.prototype.valueOf ( ) #

Возвращает строковое значение.

Функция valueOf не является родовой функцией. Если её значение this – не строка или не объект типа String, она генерирует исключение TypeError. Поэтому она не может передаваться другим типам объектов для использования в качестве метода.

15.5.4.4 String.prototype.charAt (pos) #

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

Если pos является целочисленным значением типа Number, то результат x.charAt( pos) равен результату x.substring( pos, pos+1).

При вызове метода charAt с одним аргументом pos выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть position будет ToInteger(pos).

  4. Пусть size будет количеством символов в S.

  5. Если position < 0 или positionsize, вернуть пустую строку.

  6. Вернуть строку длиной 1, содержащую один символ из S, а именно – символ в позиции position, где считается, что первый (крайний левый) символ в S находится в позиции 0, следующий символ – в позиции 1, и так далее.

ПРИМЕЧАНИЕ Функция charAt специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.5 String.prototype.charCodeAt (pos) #

Возвращает значение типа Number (неотрицательное целое число, меньше чем 216), представляющее собой кодовое значение символа в позиции pos в строке, полученной в результате преобразования данного объекта в тип String. Если в этой позиции нет символов, результатом является NaN.

При вызове метода charCodeAt с одним аргументом pos выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть position будет ToInteger(pos).

  4. Пусть size будет количеством символов в S.

  5. Если position < 0 или positionsize, вернуть NaN.

  6. Вернуть значение типа Number, которое представляет собой кодовое значение символа в позиции position в строке S, где считается, что первый символ (крайний левый) находится в позиции 0, следующий – в позиции 1, и так далее.

ПРИМЕЧАНИЕ Функция charCodeAt специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.6 String.prototype.concat ( [ string1 [ , string2 [ , … ] ] ] ) #

При вызове метода concat с аргументами string1, string2, и т.д. в количестве ноль или более, возвращается строка, состоящая из символов этого объекта (преобразованного в тип String), за которыми следуют символы каждого из аргументов string1, string2, и т.д. (где каждый аргумент был преобразован в тип String). Результатом является строковое значение, а не объект String. При этом выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть args будет внутренним списком, который является копией списка аргументов, переданных в эту функцию.

  4. Пусть R будет S.

  5. Повторять, пока args не равно пусто.

    1. Удалить из args первый элемент, и пусть next будет значением этого элемента.

    2. Пусть R будет строковым значением, состоящим из предыдущего значения R, за которым следуют символы из ToString(next).

  6. Вернуть R.

Свойство length для метода concat равно 1.

ПРИМЕЧАНИЕ Функция concat специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.7 String.prototype.indexOf (searchString, position) #

Если результатом преобразования этого объекта в тип String является подстрока searchString в одной или нескольких позициях, больших или равных position, то возвращается индекс наименьшей из таких позиций. В противном случае возвращается -1. Если position равно undefined, он принимает значение 0, что означает, что поиск будет производиться по всей строке.

Метод indexOf принимает два аргумента searchString и position и выполняет следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть searchStr будет ToString(searchString).

  4. Пусть pos будет ToInteger(position). (Если position равно undefined, значение, полученное на этом шаге, равно 0).

  5. Пусть len будет количеством символов в S.

  6. Пусть start будет min(max(pos, 0), len).

  7. Пусть searchLen будет количеством символов в searchStr.

  8. Вернуть наименьшее возможное целое число k, не меньше чем start, таким образом, чтобы k+ searchLen было не больше чем len, и чтобы для всех неотрицательных целых чисел j, меньшим чем searchLen, символ в позиции k+j в строке S был бы таким же, что и символ в позиции j в строке searchStr). Если же такого целого числа k не существует, вернуть значение -1.

Свойство length для метода indexOf равно 1.

ПРИМЕЧАНИЕ Функция indexOf специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.8 String.prototype.lastIndexOf (searchString, position) #

Если результатом преобразования этого объекта в тип String является подстрока searchString в одной или нескольких позициях, меньших или равных position, то возвращается индекс наибольшей из таких позиций. В противном случае возвращается -1. Если position равно undefined, он принимает значение длины строки, что означает, что поиск будет производиться по всей строке.

Метод lastIndexOf принимает два аргумента searchString и position и выполняет следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть searchStr будет ToString(searchString).

  4. Пусть numPos будет ToNumber(position). (Если position равно undefined, значение, полученное на этом шаге, равно NaN).

  5. Если numPos равно NaN, пусть pos будет +. В противному случае пусть pos будет ToInteger(numPos).

  6. Пусть len будет количеством символов в S.

  7. Пусть start будет min(max(pos, 0), len).

  8. Пусть searchLen будет количеством символов в searchStr.

  9. Вернуть наибольшее возможное неотрицательное целое число k, не больше чем start, таким образом, чтобы k+ searchLen было не больше чем len, и чтобы для всех неотрицательных целых чисел j, меньшим чем searchLen, символ в позиции k+j в строке S был бы таким же, что и символ в позиции j в строке searchStr). Если же такого целого числа k не существует, вернуть значение -1.

Свойство length для метода lastIndexOf равно 1.

ПРИМЕЧАНИЕ Функция lastIndexOf специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.9 String.prototype.localeCompare (that) #

При вызове метода localeCompare с одним аргументом that возвращается число, отличное от NaN, которое представляет собой результат строкового сравнения (выполненного с учётом языковых настроек) этого значения, преобразованного в строку, с that, преобразованного в строку. Эти две строки – S и That. Они сравниваются способом, заданным реализацией. Полученный результат должен располагать строковые значения в порядке сортировки, заданной в соответствии с системными языковыми настройками по умолчанию. Результат будет отрицательным, если в этом порядке сортировки S находится перед That, нулевым, если строки равны, и положительным, если S находится перед That.

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

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть That будет ToString(that).

Если рассматривать метод localeCompare как функцию с двумя аругментами this и that, он является последовательной функцией сравнения (в соответствии с определением в главе 15.4.4.11), производимого над множеством всех строк.

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

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

ПРИМЕЧАНИЕ 1 Сам по себе метод localeCompare не подходит в качестве аргумента для Array.prototype.sort, поскольку последний требует функции с двумя аргументами.

ПРИМЕЧАНИЕ 2 Эта функция должна полагаться на тот набор функциональных возможностей сравнения в соответствии с языковыми настройками, который доступен среде ECMAScript из внешней среды, и должна производить сравнение в соответствии с правилами текущих языковых настроек внешней среды. Настоятельно рекомендуется, чтобы эта функция рассматривала строки, являющиеся канонически эквивалентными в соответствии со стандартом Юникода, как идентичные (иными словами, чтобы она сравнивала строки, как если бы они обе были сначала преобразованы в соответствии с Формой нормализации "C" или "D"). Кроме того, рекомендуется, чтобы эта функция не соблюдала юникодные эквивалентности по совместимости и декомпозиции совместимости.

ПРИМЕЧАНИЕ 3 Второй параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

ПРИМЕЧАНИЕ 4 Функция localeCompare специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.10 String.prototype.match (regexp) #

При вызове метода match с аргументом regexp выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Если Type(regexp) равен Object, а значение внутреннего свойства [[Class]] для regexp равно "RegExp", то пусть rx будет regexp;

  4. Иначе, пусть rx будет новым объектом RegExp, как если бы он был создан выражением new RegExp( regexp), где RegExp является стандартным встроенным конструктором с этим именем.

  5. Пусть global будет результатом вызова внутреннего метода [[Get]] для rx с аргументом "global".

  6. Пусть exec будет стандартной встроенной функцией RegExp.prototype.exec (см. 15.10.6.2)

  7. Если global не равно true, то

    1. Вернуть результат вызова внутреннего метода [[Call]] для exec с rx в качестве значения this и со списком аргументов, содержащим S.

  1. Иначе global равно true.

    1. Вызвать внутренний метод [[Put]] для rx с аргументами "lastIndex" и 0.

    2. Пусть A будет новым массивом, как если бы он был создан выражением new Array(), где Array является стандартным встроенным конструктором с этим именем.

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

    4. Пусть n будет 0.

    5. Пусть lastMatch будет true.

    6. Повторять, пока lastMatch равно true.

      1. Пусть result будет результатом вызова внутреннего метода [[Call]] для exec с rx в качестве значения this и со списком аргументов, содержащим S.

      2. Если result равно null, то присвоить lastMatch значение false.

      3. Иначе result не равно null

        1. Пусть thisIndex будет результатом вызова внутреннего метода [[Get]] для rx с аргументом "lastIndex".

        2. Если thisIndex = previousLastIndex, то

          1. Вызвать внутренний метод [[Put]] для rx с аргументами "lastIndex" и thisIndex+1.

          2. Присвоить previousLastIndex значение thisIndex+1.

        3. Иначе присвоить previousLastIndex значение thisIndex.

        4. Пусть matchStr будет результатом вызова внутреннего метода [[Get]] для result с аргументом "0".

        5. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(n), Property Descriptor {[[Value]]: matchStr, [[Writable]]: true, [[Enumerable]]: true, [[configurable]]: true} и false.

        6. Увеличить n.

    7. Если n = 0, вернуть null.

    8. Вернуть А.

ПРИМЕЧАНИЕ Функция match специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.11 String.prototype.replace (searchValue, replaceValue) #

Сначала необходимо присвоить string значение, как указано ниже:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть string будет результатом вызова ToString, с передачей значения this в качестве аргумента.

Если searchValue является регулярным выражением (объектом, внутреннее свойство [[Class]] которого равно "RegExp"), необходимо выполнить следующее: Если searchValue.global равно false, выполнить поиск по строке string и найти первое совпадение с регулярным выражением searchValue. Если searchValue.global равно true, выполнить поиск по строке string и найти все совпадения с регулярным выражением searchValue. Поиск необходимо производить так же, как и в String.prototype.match, включая обновление значения searchValue.lastIndex. Пусть m – количество левых захватывающих скобок capturing parentheses в searchValue (при использовании NcapturingParens, как указано в 15.10.2.1).

Если searchValue не является регулярным выражением, пусть searchString будет ToString(searchValue), и выполнить поиск по string, чтобы найти первое вхождение searchString. Пусть m будет равно 0.

Если replaceValue является функцией, то для каждой найденной подстроки вызвать функцию с аргументами в количестве m + 3, описанными далее: Аргумент 1 – это найденная подстрока. Если searchValue – регулярное выражение, то все следующие аргументов являются захваченными элементами captures в MatchResult (см. пункт 15.10.2.1). Аргумент m + 2 – смещение в строке string, где было найдено совпадение, а аргумент m + 3 равен string. Результатом является строковое значение, полученное в результате замены в начальном входном значении каждой найденной подстроки на результат соответствующего вызова функции, преобразованный в строку (в случае необходимости).

Иначе, пусть newstring означает результат преобразования replaceValue в строку. Результатом является строковое значение, полученное в результате замены в начальной входной строке каждой найденной подстроки на строку, полученную из newstring посредством замены символов в newstring на заменяющий текст, приведённый в Таблице 22. Эти заамены с использованием $ производится слева направо. После выполнения такой замены вставленный заменяющий текст уже не должен подвергаться дальнейшей процедуре замены. Например, "$1,$2".replace(/(\$(\d))/g, "$$1-$1$2") возвращает "$1-$11,$1-$22". Если символ $ в подстроке newstring не соответствует ни одной из нижеуказанных форм, его следует оставить как есть.

Таблица 22 — Замена символов на текст

Символ

Заменяющий текст

$$

$

$&

Найденная подстрока.

$‘

Часть строки string, предшествующая найденной подстроке.

$’

Часть строки string, следующая за найденной подстрокой.

$n

Захваченный элемент № n, где n – одиночное число от 1 до 9, и при этом за $n не следует десятичных цифр. Если nm, и захваченный элемент № n равен undefined, вместо него используют пустую строку. Если n>m, то результат зависит от реализации.

$nn

Захваченный элемент № nn, где nn – двузначное десятичное число от 01 до 99. Если nnm, и захваченный элемент № nn равен undefined, вместо него используют пустую строку. Если nn>m, то результат зависит от реализации.

ПРИМЕЧАНИЕ Функция replace специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.12 String.prototype.search (regexp) #

При вызове метода search с аргументом regexp выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть string будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Если Type(regexp) равен Object, а значение внутреннего свойства [[Class]] для regexp равно "RegExp", то пусть rx будет regexp;

  4. Иначе, пусть rx будет новым объектом RegExp, как если бы он был создан выражением new RegExp( regexp), где RegExp является стандартным встроенным конструктором с этим именем.

  5. Произвести поиск по string с самого начала и найти вхождение шаблона регулярного выражения rx. Пусть result будет равен числу, обозначающему смещение в строке string, где был найден такой шаблон, или будет равен –1, если такой шаблон не был найден. При осуществлении этого поиска свойства lastIndex и global для regexp игнорируются. Свойство lastIndex для regexp остаётся без изменений.

  6. Вернуть result.

ПРИМЕЧАНИЕ Функция search специально является родовой функцией. Она не требует, чтобы её значение 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. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть len будет количеством символов в S.

  4. Пусть intStart будет ToInteger(start).

  5. Если endundefined, пусть intEnd будет len; иначе пусть intEnd будет ToInteger(end).

  6. Если intStart имеет отрицательное значение, пусть from будет max(len + intStart,0); иначе, пусть from будет min(intStart,len).

  7. Если intEnd имеет отрицательное значение, пусть to будет max(len +intEnd,0); иначе, пусть to будет min(intEnd, len).

  8. Пусть span будет max(to from,0).

  9. Вернуть строку, содержащую последовательные символы в количестве span из S, начиная с символа в позиции from.

Свойство 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. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть A будет новым массивом, как если бы он был создан выражением new Array(), где Array является стандартным встроенным конструктором с этим именем.

  4. Пусть lengthA будет 0.

  5. Если limit равен undefined, пусть lim = 232–1; иначе пусть lim = ToUint32(limit).

  6. Пусть s будет количеством символов в S.

  7. Пусть p = 0.

  8. Если separator – объект RegExp (то есть, его [[Class]] равен "RegExp"), то пусть R = separator; в противном случае пусть R = ToString(separator).

  9. Если lim = 0, вернуть A.

  10. Если separatorundefined, то

    1. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами "0", Property Descriptor {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

    2. Вернуть А.

  11. Если s = 0, то

    1. Вызвать SplitMatch(S, 0, R), и пусть z будет его результатом MatchResult.

    2. Если z – не failure, вернуть A.

    3. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами "0", Property Descriptor {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

    4. Вернуть А.

  12. Пусть q = p.

  13. Повторить, пока q s

    1. Вызвать SplitMatch(S, q, R), и пусть z будет его результатом MatchResult.

    2. Если zfailure, то пусть q = q+1.

    3. Иначе, z – не failure

      1. z должно быть State. Пусть e будет endIndex для z, и пусть cap будет массивом захваченных результатов для z.

      2. Если e = p, то пусть q = q+1.

      3. Иначе, e p

        1. Пусть T будет строковым значением, равным подстроке S, состоящей из символов в позициях с p (включительно) по q (не включительно)

        2. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(lengthA), Property Descriptor {[[Value]]: T, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

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

        4. Если lengthA = lim, вернуть A.

        5. Пусть p = e.

        6. Пусть i = 0.

        7. Повторить, пока i не будет равно количеству элементов в cap.

          1. Пусть i = i+1.

          2. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(lengthA), Property Descriptor {[[Value]]: cap[i], [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

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

          4. Если lengthA = lim, вернуть A.

        8. Пусть q = p.

  14. Пусть T будет строковым значением, равным подстроке S, состоящей из символов в позициях с p (включительно) по s (не включительно)

  15. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(lengthA), Property Descriptor {[[Value]]: T, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

  16. Вернуть А.

Абстрактная операция SplitMatch принимает три параметра: строку S, целое число q, и строку или RegExp R, и, с целью вернуть MatchResult (см. пункт 15.10.2.1), выполняет следующие действия:

  1. Если R – объект RegExp (его [[Class]] равен "RegExp"), то

    1. Вызвать внутренний метод [[Match]] для R, передавая аргументы S и q, и вернуть результат MatchResult.

  2. Type(R) должен быть String. Пусть r будет количеством символов в R.

  3. Пусть s будет количеством символов в S.

  4. Если q+r > s, то вернуть failure для MatchResult.

  5. Если существует такое целое число i в промежутке от 0 (включительно) до r (исключительно), чтобы символ в позиции q+i в S отличался от символа в позиции i в R, то вернуть failure.

  6. Пусть cap будет пустым массивом захваченных элементов (см. пункт 15.10.2.1).

  7. Вернуть State (q+r, cap). (см. 15.10.2.1)

Свойство length для метода split равно 2.

ПРИМЕЧАНИЕ 1 Метод split игнорирует значение разделителя .global для разделителей, которые являются объектами RegExp.

ПРИМЕЧАНИЕ 2 Функция split специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.15 String.prototype.substring (start, end) #

Метод substring принимает два аргумента start и end и возвращает подстроку, полученную в результате преобразования в строку этого объекта, начиная с позиции start и до позиции end не включительно (или до конца строки, если end равно undefined). Результатом является строковое значение, а не объект String.

Если какой-либо из аргументов является либо NaN, либо отрицательным числом, он заменяется на ноль. Если какой-либо из аргументов больше, чем длина строки, он заменяется значением длины строки.

Если start больше, чем end, аргументы меняются местами.

При этом выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть len будет количеством символов в S.

  4. Пусть intStart будет ToInteger(start).

  5. Если endundefined, пусть intEnd будет len; иначе пусть intEnd будет ToInteger(end).

  6. Пусть finalStart будет min(max(intStart, 0), len).

  7. Пусть finalEnd будет min(max(intEnd, 0), len).

  8. Пусть from будет min(finalStart, finalEnd).

  9. Пусть to будет max(finalStart, finalEnd).

  10. Вернуть строку, длина которой равна to - from, и которая содержит символы из S, а именно: символы с индексами от from до to 1 в восходящем порядке.

Свойство length для метода substring равно 2.

ПРИМЕЧАНИЕ Функция substring специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.16 String.prototype.toLowerCase ( ) #

При этом выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

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

  4. Вернуть L.

В целях данной операции 16-битовые кодовые единицы строки вычисляются как кодовые точки Основной многоязычной матрицы Юникода. Суррогатные кодовые точки напрямую передаются из S в L без нахождения соответствий.

Результат должен быть получен в соответствии с отображением регистров в Базе данных символов Юникода (в неё однозначно входит не только файл UnicodeData.txt file, но и файл SpecialCasings.txt, сопровождающий его в стандарте Юникод версии 2.1.8 и более поздних).

ПРИМЕЧАНИЕ 1 Отображение регистров для некоторых символов может привести к возникновению различных символов. В этом случае длина результирующей строки может отличаться от длины исходной строки. Поскольку поведение функций toUpperCase и toLowerCase является контекстно-зависимым, эти функции не симметричны. Иными словами, s.toUpperCase().toLowerCase() не обязательно будет равно s.toLowerCase().

ПРИМЕЧАНИЕ 2 Функция toLowerCase специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.17 String.prototype.toLocaleLowerCase ( ) #

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

ПРИМЕЧАНИЕ 1 Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

ПРИМЕЧАНИЕ 2 Функция toLocaleLowerCase специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.18 String.prototype.toUpperCase ( ) #

Данная функция действует точно так же, как и String.prototype.toLowerCase, с той лишь разницей, что эквиваленты символов в верхнем регистре отображаются в соответствии с Базой данных символов Юникода.

ПРИМЕЧАНИЕ Функция toUpperCase специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.19 String.prototype.toLocaleUpperCase ( ) #

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

ПРИМЕЧАНИЕ 1 Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

ПРИМЕЧАНИЕ 2 Функция toLocaleUpperCase специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.4.20 String.prototype.trim ( ) #

При этом выполняются следующие шаги:

  1. Вызвать CheckObjectCoercible, передавая this в качестве аргумента.

  2. Пусть S будет результатом вызова ToString, с передачей значения this в качестве аргумента.

  3. Пусть T будет строковым значением, представляющим собой копию строки S, у которой удалены начальный и конечный пробелы. Определение пробела объединяет в себе Пробельный символ WhiteSpace и Символ окончания строки LineTerminator.

  4. Вернуть T.

ПРИМЕЧАНИЕ Функция trim специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа String. Поэтому она может передаваться другим типам объектов для использования в качестве метода.

15.5.5 Свойства экземпляров String #

Экземпляры String наследуют свойства объекта-прототипа String. Значение их внутреннего свойства [[Class]] равно "String". Кроме того, у экземпляров String имеются внутреннее свойство [[PrimitiveValue]], свойство length, а также набор перечислимых свойств, имена которых соответствуют индексам массива.

Внутреннее свойство [[PrimitiveValue]] представляет собой строковое значение, представленное этим объектом String. Свойства с именами-индексами массива соответствуют отдельным символам строкового значения. Специальный внутренний метод [[GetOwnProperty]] используется для указания количества, значений и атрибутов свойств с именами-индексами массива.

15.5.5.1 length #

Количество символов в строковом значении, представленном этим объектом String.

После создания объекта String это свойство уже не изменяется. Оно имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.5.5.2 [[GetOwnProperty]] ( P ) #

Объекты String используют разновидность внутреннего метода [[GetOwnProperty]], применяемого и для других родных объектов ECMAScript (см. пункт 8.12.1). Этот специальный внутренний метод используется для добавления доступа для именованных свойств, соответствующих отдельным символам объектов String.

Допустим, S – это объект String, а P – строка.

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

  1. Пусть desc будет результатом вызова внутреннего метода по умолчанию [[GetOwnProperty]] (пункт 8.12.1) для S с аргументом P.

  2. Если desc – не undefined, вернуть desc.

  3. Если ToString(abs(ToInteger(P))) не имеет такого же значения, что и P, вернуть undefined.

  4. Пусть str будет строковым значением внутреннего свойства [[PrimitiveValue]] для S.

  5. Пусть index будет ToInteger(P).

  6. Пусть len будет количеством символов в str.

  7. Если lenindex, вернуть undefined.

  8. Пусть resultStr будет строкой длиной 1, содержащей один символ из str, а именно – символ в позиции index, где считается, что первый (крайний левый) символ в str находится в позиции 0, следующий символ – в позиции 1, и так далее.

  9. Вернуть Property Descriptor { [[Value]]: resultStr, [[Enumerable]]: true, [[Writable]]: false, [[Configurable]]: false }