JavaScript | Строки (String)

JavaScript | Строки (String)

Строка — это неизменяемая, упорядоченная последовательность 16-битных значений, каждое из которых обычно представляет символ Юникода. Строки в JavaScript являются типом данных, используемым для представления текста. Длина строки — это количество 16-битных значений, содержащихся в ней. Нумерация символов в строках (и элементов в массивах) в языке JavaScript начинается с нуля: первое 16-битное значение находится в позиции 0, второе — в позиции 1 и т.д.. Пустая строка — это строка, длина которой равна 0.

В языке JavaScript нет специального типа для представления единственного элемента строки. Для представления единственного 16-битного значения просто используется строка с длиной, равной 1.

 

Конструктор строк (String)

Конструктор String:

  • является %String%.
  • является начальным значением свойства «String» глобального объекта.
  • создает и инициализирует новый объект String при вызове в качестве конструктора.
  • выполняет преобразование типа при вызове функции, а не конструктора.
  • предназначен для создания подклассов. Он может использоваться как значение предложения extends определения класса. Конструкторы подкласса, которые намереваются наследовать указанное поведение String, должны включать вызов super конструктора String для создания и инициализации экземпляра подкласса с внутренним слотом [[StringData]].

String ( value )

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

1. Если значение value не указано, пусть s будет пустой строкой.
2. Иначе,
   a. Если NewTarget является undefined (не определен) и Type(value) - Symbol, вернуть SymbolDescriptiveString(value).
   b. Пусть s будет ? ToString(value).
3. Если NewTarget undefined (не определен), верните s.
4. Вернуть ! StringCreate(s, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%")).

 

Свойства конструктора String

Конструктор String:

  • имеет внутренний слот [[Prototype]], значение которого — %Function.prototype%.
  • Конструктор String имеет следующие свойства:

 

String.fromCharCode ( …codeUnits )

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

1. Пусть length будет количеством элементов в codeUnits.
2. Пусть elements будут новым пустым Списком.
3. Для каждого элемента next из codeUnits, выполните
   a. Пусть nextCU будет  (? ToUint16(next)).
   b. Добавьте nextCU в конец элементов elements.
4. Верните значение String, единицы кода которого являются элементами в Списке elements. Если codeUnits пуст, возвращается пустая строка.

Свойство «length» функции fromCharCode равно 1𝔽.

 

String.fromCodePoint ( …codePoints )

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

1. Пусть elements будут новым пустым списком.
2. Для каждого элемента next из codePoints, выполните
   a. Пусть nextCP будет ? ToNumber(next).
   b. Если ! IsIntegralNumber(nextCP) имеет значение false, генерировать исключение RangeError.
   c. Если  (nextCP) < 0 или  (nextCP) > 0x10FFFF, выбросить исключение RangeError.
   d. Добавьте элементы bp ! CodePointToUTF16CodeUnits( (nextCP)) до конца элементов elements.
3. Верните значение String, единицы кода которого являются элементами в Списке elements. Если codePoints пуст, возвращается пустая Строка.

Свойство «length» функции fromCodePoint равно 1𝔽.

 

String.prototype

Начальным значением String.prototype является объект-прототип String.

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

 

String.raw ( template, …substitutions )

Функцию String.raw можно вызывать с переменным количеством аргументов. Первый аргумент — это шаблон template, а остальные аргументы образуют замены substitutions списка List. Выполняются следующие шаги:

1. Пусть numberOfSubstitutions будет количеством элементов в заменах substitutions.
2. Пусть cooked будет ? ToObject(template).
3. Пусть raw будет ? ToObject(? Get(cooked, "raw")).
4. Пусть literalSegments будут ? LengthOfArrayLike(raw).
5. Если literalSegments ≤ 0, вернуть пустую Строку.
6. Пусть stringElements будет новым пустым Списком.
7. Пусть nextIndex равен 0.
8. Повторять,
   a. Пусть nextKey будет ! ToString(𝔽(nextIndex)).
   b. Пусть nextSeg будет ? ToString(? Get(raw, nextKey)).
   c. Добавьте элементы кодового блока nextSeg в конец stringElements.
   d. Если nextIndex + 1 = literalSegments, то
      i. Верните значение строки String, единицы кода которого являются элементами в Списке stringElements. Если stringElements не имеет элементов, возвращается пустая строка.
   e. Если nextIndex < numberOfSubstitutions, пусть next будет заменами substitutions[nextIndex].
   f. В противном случае пусть next будет пустой строкой.
   g. Пусть nextSub будет ? ToString(next).
   h. Добавьте элементы кодового блока nextSub в конец stringElements.
   i. Установите nextIndex на nextIndex + 1.
Примечание

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

 

Свойства объекта-прототипа String

 

Объект-прототип String:

  • является %String.prototype%.
  • является экзотическим объектом String и имеет внутренние методы, указанные для таких объектов.
  • имеет внутренний слот [[StringData]], значением которого является пустая строка.
  • имеет свойство «length«, начальное значение которого равно 0, а атрибуты — {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.
  • имеет внутренний слот [[Prototype]], значение которого равно %Object.prototype%.

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

Абстрактная операция thisStringValue принимает аргумент value. При вызове он выполняет следующие шаги:

1. Если Type(value) - это Строка, вернуть value.
2. Если Type(value) - это Объект, а значение value имеет внутренний слот [[StringData]], тогда
   a. Пусть s будет value.[[StringData]].
   b. Утверждение: Type(s) - это String.
   c. Вернуть s
3. Вызвать исключение TypeError.

 

String.prototype.charAt ( pos )

Примечание 1

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

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть position будет ? ToIntegerOrInfinity(pos).
4. Пусть size будет длиной S.
5. Если position < 0 или positionsize, вернуть пустую Строку.
6. Верните значение Строки длины 1, содержащее одну кодовую единицу из S, а именно кодовую единицу индекса position.
Примечание 2

Функция charAt намеренно является универсальной; она не требует, чтобы значение this было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.charCodeAt ( pos )

Примечание 1

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

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть position будет ? ToIntegerOrInfinity(pos).
4. Пусть size будет длиной S.
5. Если position < 0 или positionsize, вернуть NaN.
6. Вернуть значение Числа для числового значения единицы кода в position индекса в строке S.
Примечание 2

Функция charCodeAt намеренно универсальна; она не требует, чтобы значение this было объектом String. Поэтому её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.codePointAt ( pos )

Примечание 1

Возвращает неотрицательное целое Число, меньшее или равное 0x10FFFF𝔽, которое является значением кодовой точки кодовой точки в кодировке UTF-16 (6.1.4), начиная со строкового элемента с индексом pos внутри String, полученного в результате преобразования этого объекта в Строку.

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть position будет ? ToIntegerOrInfinity(pos).
4. Пусть size будет длиной S.
5. Если position < 0 или positionsize, вернуть undefined.
6. Пусть cp будет ! CodePointAt(S, position).
7. Вернуть 𝔽(cp.[[CodePoint]]).
Примечание 2

Функция codePointAt намеренно носит общий характер; она не требует, чтобы значение this было объектом String. Поэтому её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.concat ( …args )

Примечание 1

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

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Let R be S.
4. Для каждого элемента next из args, выполните
   a. Пусть nextString будет ? ToString(next).
   b. Установите R на конкатенацию строк R и nextString.
5. Вернуть R

Свойство «length» метода concat равно 1𝔽.

Примечание 2

Функция concat намеренно является универсальной; она не требует, чтобы значение this было объектом String. Поэтому её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.constructor

Начальное значение String.prototype.constructor — это %String%.

 

String.prototype.endsWith ( searchString [ , endPosition ] )

Выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть isRegExp будет ? IsRegExp(searchString).
4. Если isRegExp истинно true, выбросить исключение TypeError.
5. Пусть searchStr будет ? ToString(searchString).
6. Пусть len будет длиной S.
7. Если endPosition не определено undefined, пусть pos будет len; еще пусть pos будет ? ToIntegerOrInfinity(endPosition).
8. Пусть end будет результатом зажима pos между 0 и len.
9. Пусть searchLength будет длиной searchStr.
10. Если searchLength = 0, вернуть true.
11. Пусть начало start будет концом end - searchLength.
12. Если start < 0, вернуть false.
13. Пусть substring будет подстрокой S от начала start до конца end.
14. Вернуть ! SameValueNonNumeric(substring, searchStr).
Примечание 1

Возвращает true, если последовательность кодовых единиц searchString, преобразованных в String, совпадает с соответствующими кодовыми единицами этого объекта (преобразованными в String), начиная с endPosition — length(this). В противном случае возвращает false.

Примечание 2

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

Примечание 3

Функция endWith намеренно является универсальной; он не требует, чтобы значение this было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.includes ( searchString [ , position ] )

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть isRegExp будет ? IsRegExp(searchString).
4. Если isRegExp истинно true, выбросить исключение TypeError.
5. Пусть searchStr будет ? ToString(searchString).
6. Пусть pos будет ? ToIntegerOrInfinity(position).
7. Утверждение: Если position является undefined, то позиция pos равна 0.
8. Пусть len будет длиной S.
9. Пусть start будет результатом зажима pos между 0 и len.
10. Пусть index будет ! StringIndexOf(S, searchStr, start).
11. Если index не -1, верните true.
12. Верните false.
Примечание 1

Если searchString появляется как подстрока результата преобразования этого объекта в String, по одному или нескольким индексам, которые больше или равны позиции position, вернуть true; в противном случае возвращает false. Если позиция position не определена (является undefined), предполагается 0, чтобы выполнить поиск по всей Строке.

Примечание 2

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

Примечание 3

Функция include намеренно носит общий характер; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.indexOf ( searchString [ , position ] )

Примечание 1

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

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть searchStr будет ? ToString(searchString).
4. Пусть pos будет ? ToIntegerOrInfinity(position).
5. Утверждение: Если position является undefined, то позиция pos равна 0.
6. Пусть len будет длиной S.
7. Пусть start будет результатом зажима pos между 0 и len.
8. Вернуть 𝔽(! StringIndexOf(S, searchStr, start)).
Примечание 2

Функция indexOf намеренно общая; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.lastIndexOf ( searchString [ , position ] )

Примечание 1

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

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть searchStr будет ? ToString(searchString).
4. Пусть numPos будет ? ToNumber(position).
5. Утверждение: Если позиция position не определена (является undefined), то numPos равно NaN.
6. Если numPos равно NaN, пусть pos будет +∞; в противном случае пусть pos будет ! ToIntegerOrInfinity(numPos).
7. Пусть len будет длиной S.
8. Пусть start будет результатом зажима pos между 0 и len.
9. Пусть searchLen будет длиной searchStr.
10. Пусть k будет наибольшим возможным неотрицательным целым числом, не большим, чем start, такое, что k + searchLenlen, и для всех неотрицательных целых j таких, что j < searchLen, единица кода с индексом k + j внутри S такая же, как кодовый блок с индексом j в searchStr; но если такого целого числа нет, пусть k будет -1.
11. Вернуть 𝔽(k).
Примечание 2

Функция lastIndexOf намеренно является универсальной; она не требует, чтобы значение this было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )

Реализация ECMAScript, включающая API-интерфейс интернационализации ECMA-402, должна реализовывать метод localeCompare, как указано в спецификации ECMA-402. Если реализация ECMAScript не включает API ECMA-402, используется следующая спецификация метода localeCompare.

Когда метод localeCompare вызывается с аргументом that, он возвращает Number, отличное от NaN, которое представляет результат зависящего от языкового стандарта сравнения String значения this (преобразованного в String) с that (преобразованным в String). Две Строки — это S и That. Две строки сравниваются способом, определяемым реализацией. Результат предназначен для упорядочивания значений String в порядке сортировки, заданном локалью хоста по умолчанию, и будет отрицательным, нулевым или положительным, в зависимости от того, идет ли S до That в порядке сортировки, строки равны или S идет после That в порядке сортировки соответственно.

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть That будет ? ToString(that).

Значение необязательных второго и третьего параметров этого метода определено в спецификации ECMA-402; реализации, которые не включают поддержку ECMA-402, не должны назначать никакую другую интерпретацию этим позициям параметров.

Метод localeCompare, если он рассматривается как функция двух аргументов, this и that, является последовательной функцией сравнения (как определено в 22.1.3.27) для набора всех строк.

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

Примечание 1

Сам метод localeCompare не подходит непосредственно в качестве аргумента для Array.prototype.sort, поскольку последний требует функции двух аргументов.

Примечание 2

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

Рекомендуется, чтобы эта функция не учитывала эквивалентность или декомпозицию совместимости Unicode. Для определения и обсуждения канонической эквивалентности см. Стандарт Unicode, главы 2 и 3, а также Приложение № 15 к стандарту Unicode, Формы нормализации Unicode (https://unicode.org/reports/tr15/) и Техническое примечание Unicode № 5. , Каноническая эквивалентность в приложениях (https://www.unicode.org/notes/tn5/). Также см. Технический стандарт Unicode # 10, Алгоритм сортировки Unicode (https://unicode.org/reports/tr10/).

Примечание 3

Функция localeCompare намеренно является универсальной; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.match ( regexp )

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Если regexp не является ни undefined, ни null, тогда
   a. Пусть matcher будет ? GetMethod(regexp, @@match).
   b. Если matcher не определён (является undefined), тогда
      i. Вернуть ? Call(matcher, regexp, « O »).
3. Пусть S будет ? ToString(O).
4. Пусть rx будет ? RegExpCreate(regexp, undefined).
5. Вернуть ? Invoke(rx, @@match, « S »).
Примечание

Функция совпадения match намеренно универсальна; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.matchAll ( regexp )

Выполняет сопоставление регулярного выражения String, представляющего значение this, с regexp и возвращает итератор. Значение результата каждой итерации — это объект Array, содержащий результаты совпадения, или null, если String не совпал.

Когда вызывается метод matchAll, выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Если regexp не является ни undefined, ни null, тогда
   a. Пусть isRegExp будет ? IsRegExp(regexp).
   b. Если isRegExp истинно true, то
      i. Пусть flags будет ? Get(regexp, "flags").
      ii. Выполнить ? RequireObjectCoercible(flags).
      iii. Если ? ToString(flags) не содержит «g», генерирует исключение TypeError.
   c. Пусть matcher будет ? GetMethod(regexp, @@matchAll).
   d. Если совпадение matcher не определено (является undefined), тогда
      i. Вернуть ? Call(matcher, regexp, « O »).
3. Пусть S будет ? ToString(O).
4. Пусть rx будет ? RegExpCreate(regexp, "g").
5. Вернуть ? Invoke(rx, @@matchAll, « S »).
Примечание 1

Функция matchAll намеренно является универсальной, она не требует, чтобы ее значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

Примечание 2

Как и String.prototype.split, String.prototype.matchAll обычно действует без изменения входных данных.

 

String.prototype.normalize ( [ form ] )

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Если форма form не определена (является undefined), пусть f будет «NFC».
4. Иначе пусть f будет? ToString(form).
5. Если f не является одним из «NFC», «NFD», «NFKC» или «NFKD», выбросить исключение RangeError.
6. Пусть ns будет значением String, которое является результатом нормализации S в форму нормализации, названную f, как указано в https://unicode.org/reports/tr15/.
7. Вернуть ns
Примечание

Функция нормализации normalize намеренно универсальна; она не требует, чтобы значение this было объектом String. Поэтому её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.padEnd ( maxLength [ , fillString ] )

Когда вызывается метод padEnd, выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Вернуть ? StringPad(O, maxLength, fillString, end).

 

String.prototype.padStart ( maxLength [ , fillString ] )

Когда вызывается метод padStart, выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Вернуть ? StringPad(O, maxLength, fillString, start).

 

StringPad ( O, maxLength, fillString, placement )

Абстрактная операция StringPad принимает аргументы O, maxLength, fillString и placement. При вызове она выполняет следующие шаги:

1. Утверждение: размещение placement -  это начало start или конец end.
2. Пусть S будет ? ToString(O).
3. Пусть intMaxLength будет (? ToLength(maxLength)).
4. Пусть stringLength будет длиной S.
5. Если intMaxLengthstringLength, вернуть S.
6. Если fillString не определено (является undefined), пусть заполнителем filler будет значение String, состоящее исключительно из кодовой единицы 0x0020 (SPACE).
7. Иначе пусть filler будет ? ToString(fillString).
8. Если filler является пустой Строкой, верните S.
9. Пусть fillLen будет intMaxLength - stringLength.
10. Пусть truncatedStringFiller будет значением String, состоящим из повторяющихся конкатенаций заполнителя filler, усеченного до длины fillLen.
11. Если размещение placement является начальным - start, верните конкатенацию строк truncatedStringFiller и S.
12. В противном случае верните конкатенацию строк S и truncatedStringFiller.
Примечание 1

Аргумент maxLength будет ограничен так, чтобы он не мог быть меньше длины S.

Примечание 2

По умолчанию аргумент fillString имеет значение » » (строковое значение, состоящее из кодовой единицы 0x0020 SPACE).

 

String.prototype.repeat ( count )

Выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть n будет ? ToIntegerOrInfinity(count).
4. Если n < 0 или n равно +∞, выбросить исключение RangeError.
5. Если n равно 0, вернуть пустую строку.
6. Верните значение String, состоящее из n копий S, соединенных вместе.
Примечание 1

Этот метод создает значение String, состоящее из единиц кода значения this (преобразованного в String), повторяющееся count количество раз.

Примечание 2

Функция повтора repeat намеренно универсальна; он не требует, чтобы значение this было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.replace ( searchValue, replaceValue )

Когда метод replace вызывается с аргументами searchValue и replaceValue, выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Если searchValue не является ни undefined, ни null, тогда
   a. Пусть replacer будет ? GetMethod(searchValue, @@replace).
   b. Если replacer не undefined, тогда
      i. Вернуть ? Call(replacer, searchValue, « O, replaceValue »).
3. Пусть строка string будет? ToString(O).
4. Пусть searchString будет ? ToString(searchValue).
5. Пусть functionReplace будет IsCallable(replaceValue).
6. Если functionReplace имеет значение false, тогда
   a. Установите replaceValue на ? ToString(replaceValue).
7. Пусть searchLength будет длиной searchString.
8. Пусть положение position будет ! StringIndexOf(string, searchString, 0).
9. Если позиция position равна -1, вернуть строку string.
10. Пусть preserved будет подстрокой string от 0 до position.
11. Если functionReplace истинен, то
   a. Пусть замена replacement будет ? ToString(? Call(replaceValue, undefined, «searchString, 𝔽(position), string»)).
12. Иначе,
   a. Утверждение: Type(replaceValue) равен String.
   b. Пусть captures будет новым пустым Cписком.
   c. Пусть замена replacement будет ! GetSubstitution(searchString, string, position, captures, undefined, replaceValue).
13. Вернуть конкатенацию строки из preserved, replacement и подстроки string из position + searchLength.
Примечание

Функция замены replace намеренно универсальна; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

GetSubstitution ( matched, str, position, captures, namedCaptures, replacement )

Абстрактная операция GetSubstitution принимает аргументы matched, str, position (неотрицательное целое число), captures, namedCaptures и replacement. При вызове он выполняет следующие шаги:

1. Утверждение: Type(matched) - это строка String.
2. Пусть matchLength будет числом совпадающих кодовых единиц в matched.
3. Утверждение: Type(str) - это строка String.
4. Пусть stringLength будет числом кодовых единиц в str.
5. Утверждение: positionstringLength.
6. Утверждениеcaptures - это, возможно, пустой Список Строк.
7. Утверждение: Type(replacement) - это String.
8. Пусть tailPos будет position + matchLength.
9. Пусть m будет количеством элементов в захватах captures.
10. Пусть result будет значением String, полученным из замены replacement путем копирования элементов единицы кода из replace в result при выполнении замен, как указано в таблице 54. Эти $ замены выполняются слева направо, и, как только такая замена выполняется, новая заменённый текст не подлежит дальнейшим заменам.
11. Вернуть result

Таблица 54: Замена подстановки текстовых символов

Единицы кода (Code units) Символы юникода (Unicode Characters) Текст замены (Replacement text)
0x0024, 0x0024 $$ $
0x0024, 0x0026 $& matched
0x0024, 0x0060 $` Замена — это подстрока строки str от 0 до позиции position.
0x0024, 0x0027 $’ Если tailPosstringLength, заменой будет пустая строка. В противном случае заменой будет подстрока строки str из tailPos.
0x0024, N
Где
0x0031 ≤ N ≤ 0x0039
$n где
n это одно из 1 2 3 4 5 6 7 8 9, а за $n не следует десятичная цифра
n-ый элемент из captures, где n — одна цифра в диапазоне от 1 до 9. Если nm и n-ый элемент из captures не определен (является undefined), используйте вместо этого пустую строку. Если n > m, замена не производится.
0x0024, N, N
Где
0x0030 ≤ N ≤ 0x0039
$nn где
n одно из 0 1 2 3 4 5 6 7 8 9
nn-ый элемент из captures, где nn — двузначное десятичное число в диапазоне от 01 до 99. Если nnm и nn-ый элемент из captures не определен (является undefined), используйте вместо этого пустую строку. Если nn равно 00 или nn > m, замена не производится.
0x0024, 0x003C $< 1. Если namedCaptures не определен (является undefined), заменяющим текстом является строка «$<».
2. Иначе,a. Утверждение: Type(namedCaptures) — это Объект.
b. Сканируйте пока следующий > U+003E (знак БОЛЬШЕ ЧЕМ).
c. Если ничего не найдено, заменяющим текстом является строка «$<».
d. Иначе,
i. Пусть groupName будет вложенной подстрокой.
ii. Пусть capture будет ? Get(namedCaptures, groupName).
iii. Если capture не определен (является undefined), замените текст через > с пустой Строкой.
iv. В противном случае замените текст через > на ? ToString(capture).
0x0024 $ в любом контексте, который не соответствует ни одному из вышеперечисленных. $

 

String.prototype.replaceAll ( searchValue, replaceValue )

Когда метод replaceAll вызывается с аргументами searchValue и replaceValue, выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Если searchValue не является ни undefined, ни null, тогда
   a. Пусть isRegExp будет ? IsRegExp(searchValue).
   b. Если isRegExp истинно, то
      i. Пусть flags будут ? Get(searchValue, «flags»).
      ii. Выполнить ? RequireObjectCoercible(flags).
      iii. Если ? ToString(flags) не содержит «g», генерирует исключение TypeError.
   c. Пусть replacer будет ? GetMethod(searchValue, @@replace).
   d. Если replacer не является undefined, тогда
      i. Вернуть ? Call(replacer, searchValue, « O, replaceValue »).
3. Пусть строка string будет? ToString(O).
4. Пусть searchString будет ? ToString(searchValue).
5. Пусть functionalReplace будет IsCallable(replaceValue).
6. Если functionReplace имеет значение false, тогда
   a. Установите replaceValue на ? ToString(replaceValue).
7. Пусть searchLength будет длиной searchString.
8. Пусть advanceBy будет max(1, searchLength).
9. Пусть matchPositions будет новым пустым Списком.
10. Пусть position будет ! StringIndexOf(string, searchString, 0).
11. Повторить, пока position не -1,
   a. Добавить position в конец matchPositions.
   b. Установить position ! StringIndexOf(string, searchString, position + advanceBy).
12. Пусть endOfLastMatch будет 0.
13. Пусть результатом result будет пустая строка.
14. Для каждого элемента p из matchPositions выполните
   a. Пусть preserved будет подстрокой string от endOfLastMatch до p.
   b. Если functionReplace истинен true, то
      i. Пусть replacement будет ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(p), string »)).
   c. Иначе,
      i. Утверждение: Type(replaceValue) равен String.
      ii. Пусть captures будет новым пустым Cписком.
      iii. Пусть replacement будет ! GetSubstitution(searchString, string, p, captures, undefined, replaceValue).
   d. Задайте для результата result конкатенацию строк result, preserved и replacement.
   e. Установите для endOfLastMatch значение p + searchLength.
15. Если endOfLastMatch < длина строки string, то
   a. Задайте для результата result конкатенацию строки result и подстроки string из endOfLastMatch.
16. Вернуть result

 

String.prototype.search ( regexp )

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Если regexp не является ни undefined, ни null, тогда
   a. Пусть поисковик searcher будет ? GetMethod(regexp, @@search).
   b. Если поисковик searcher не является undefined, то
      i. Вернуть ? Call(searcher, regexp, « O »).
3. Пусть строка string будет? ToString(O).
4. Пусть rx будет ? RegExpCreate(regexp, undefined).
5. Вернуть ? Invoke(rx, @@search, « string »).
Примечание

Функция поиска search намеренно общая; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.slice ( start, end )

Метод slice принимает два аргумента, start и end, и возвращает подстроку результата преобразования этого объекта в String, начиная с начала индекса start и до конца индекса end, но не включая его (или до конца String, если end является undefined). Если start отрицательный, он обрабатывается как sourceLength + start, где sourceLength — длина строки. Если end отрицательный, он обрабатывается как sourceLength + end, где sourceLength — длина строки. Результатом является значение String, а не объект String. Выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть len будет длиной S.
4. Пусть intStart будет ? ToIntegerOrInfinity(start).
5. Если intStart равно -∞, пусть from будет 0.
6. Иначе, если intStart < 0, пусть from будет max(len + intStart, 0).
7. В противном случае пусть from будет min(intStart, len).
8. Если конец end не определен (является undefined), пусть intEnd будет len; иначе пусть intEnd будет ? ToIntegerOrInfinity(end).
9. Если intEnd равно -∞, пусть to будет 0.
10. Иначе, если intEnd < 0, пусть to будет max(len + intEnd, 0).
11. В противном случае пусть to будет min(intEnd, len).
12. Если fromto, вернуть пустую строку.
13. Вернуть подстроку S из from в to.
Примечание

Функция среза slice намеренно универсальна; она не требует, чтобы значение this было объектом String. Поэтому её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.split ( separator, limit )

Возвращает объект Array, в котором были сохранены подстроки результата преобразования этого объекта в String. Подстроки определяются путем поиска вхождений разделителя separator слева направо; эти вхождения не являются частью какой-либо строки в возвращаемом массиве, но служат для разделения значения String. Значением разделителя separator может быть строка любой длины или объект, например RegExp, который имеет метод разделения @@split.

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

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Если разделитель separator не является ни undefined, ни null, то
   a. Пусть splitter будет ? GetMethod(separator, @@split).
   b. Если splitter не является undefined, то
      i. Вернуть ? Call(splitter, separator, « O, limit »).
3. Пусть S будет ? ToString(O).
4. Пусть A будет ! ArrayCreate(0).
5. Пусть lengthA равно 0.
6. Если limit является undefined, пусть lim будет 232 - 1; иначе пусть lim будет (? ToUint32(limit)).
7. Пусть R будет ? ToString(separator).
8. Если lim = 0, вернуть A.
9. Если separator является undefined, то
   a. Выполнить ! CreateDataPropertyOrThrow(A, "0", S).
   b. Вернуть A
10. Пусть s будет длиной S.
11. Если s = 0, то
   a. Если R не является пустой строкой, тогда
      i. Выполнить ! CreateDataPropertyOrThrow(A, "0", S).
   b. Вернуть A
12. Пусть p будет 0.
13. Пусть q будет p.
14. Повторять, пока qs,
   a. Пусть e будет SplitMatch(S, q, R).
   b. Если e не совпадает (not-matched), установите q равным q + 1.
   c. Иначе,
      i. Утверждение: e - неотрицательное целое числоs.
      ii. Если e = p, установите q равным q + 1.
      iii. Иначе,
         1. Пусть T - подстрока S от p до q.
         2. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T).
         3. Установите lengthA на lengthA + 1.
         4. Если lengthA = lim, вернуть A.
         5. Установите p на e.
         6. Установите q на p.
15. Пусть T - это подстрока S от p до s.
16. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T).
17. Вернуть A
Примечание 1

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

Если значение this является пустой строкой (или преобразуется в нее), результат зависит от того, может ли разделитель separator соответствовать пустой строке. Если это возможно, результирующий массив не содержит элементов. В противном случае результирующий массив будет содержать один элемент — пустую строку.

Если разделитель separator не определен (является undefined), то массив результатов содержит только одну строку, которая является значением this (преобразованным в строку). Если limit не определен (является undefined), выходной массив усекается так, чтобы он содержал не более чем элементов limit.

Примечание 2

Функция split намеренно универсальна; она не требует, чтобы значение this было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

 

SplitMatch ( S, q, R )

Абстрактная операция SplitMatch принимает аргументы S (Строка), q (неотрицательное целое число) и R (Строка). Она возвращает либо несоответствие (not-matched), либо конечный индекс соответствия. При вызове она выполняет следующие шаги:

1. Утверждение: Type(R) - это строка String.
2. Пусть r будет количеством кодовых единиц в R.
3. Пусть s будет количеством кодовых единиц в S.
4. Если q + r > s, вернуть несоответствие (not-matched).
5. Если существует целое число i между 0 (включительно) и r (исключающее), такое, что кодовая единица с индексом q + i в S отличается от кодовой единицы с индексом i в R, вернуть несоответствие (not-matched).
6. Верните q + r.

 

String.prototype.startsWith ( searchString [ , position ] )

Выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть isRegExp будет ? IsRegExp(searchString).
4. Если isRegExp истинно true, выбросить исключение TypeError.
5. Пусть searchStr будет ? ToString(searchString).
6. Пусть len будет длиной S.
7. Если позиция position не определена (является undefined), пусть pos будет 0; иначе пусть pos будет ? ToIntegerOrInfinity(position).
8. Пусть start будет результатом зажима pos между 0 и len.
9. Пусть searchLength будет длиной searchStr.
10. Если searchLength = 0, вернуть true.
11. Пусть end будет start + searchLength.
12. Если end > len, вернуть false.
13. Пусть substring будет подстрокой S от начала start до конца end.
14. Вернуть ! SameValueNonNumeric(substring, searchStr).
Примечание 1

Этот метод возвращает истину true, если последовательность кодовых единиц searchString, преобразованных в String, совпадает с соответствующими кодовыми единицами этого объекта (преобразованными в String), начиная с позиции position индекса. В противном случае возвращает false.

Примечание 2

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

Примечание 3

Функция startWith намеренно носит общий характер; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.substring ( start, end )

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

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

Если начало start больше конца end, они меняются местами.

Выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть len будет длиной S.
4. Пусть intStart будет ? ToIntegerOrInfinity(start).
5. Если конец end не определен (является undefined), пусть intEnd будет len; иначе пусть intEnd будет ? ToIntegerOrInfinity(end).
6. Пусть finalStart будет результатом ограничения intStart между 0 и len.
7. Пусть finalEnd будет результатом ограничения intEnd между 0 и len.
8. Пусть from будет min(finalStart, finalEnd).
9. Пусть to будет max(finalStart, finalEnd).
10. Вернуть подстроку S из from в to.
Примечание

Функция подстроки substring намеренно носит общий характер; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )

Реализация ECMAScript, включающая API-интерфейс интернационализации ECMA-402, должна реализовывать метод toLocaleLowerCase, как указано в спецификации ECMA-402. Если реализация ECMAScript не включает API ECMA-402, используется следующая спецификация метода toLocaleLowerCase.

Эта функция интерпретирует значение String как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4.

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

Значение дополнительных параметров этого метода определено в спецификации ECMA-402; реализации, которые не включают поддержку ECMA-402, не должны использовать эти позиции параметров ни для чего другого.

Примечание

Функция toLocaleLowerCase намеренно носит общий характер; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )

Реализация ECMAScript, включающая API-интерфейс интернационализации ECMA-402, должна реализовывать метод toLocaleUpperCase, как указано в спецификации ECMA-402. Если реализация ECMAScript не включает API ECMA-402, используется следующая спецификация метода toLocaleUpperCase.

Эта функция интерпретирует значение String как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4.

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

Значение дополнительных параметров этого метода определено в спецификации ECMA-402; реализации, которые не включают поддержку ECMA-402, не должны использовать эти позиции параметров ни для чего другого.

Примечание

Функция toLocaleUpperCase намеренно носит общий характер; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.toLowerCase ( )

Эта функция интерпретирует значение String как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4. Выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будет ? ToString(O).
3. Пусть sText будет ! StringToCodePoints(S).
4. Пусть lowerText будет результатом toLowercase(sText) в соответствии с алгоритмом преобразования регистра Unicode по умолчанию.
5. Пусть L будет ! CodePointsToString(lowerText).
6. Вернуть L

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

Примечание 1

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

Примечание 2

Функция toLowerCase намеренно является универсальной; она не требует, чтобы значение this было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

 

 String.prototype.toString ( )

Когда вызывается метод toString, выполняются следующие шаги:

1. Вернуть ? thisStringValue(значение this).
Примечание

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

 

String.prototype.toUpperCase ( )

Эта функция интерпретирует значение String как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4.

Эта функция ведет себя точно так же, как String.prototype.toLowerCase, за исключением того, что строка отображается с использованием алгоритма toUppercase преобразования регистра Unicode по умолчанию.

Примечание

Функция toUpperCase намеренно является универсальной; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.trim ( )

Эта функция интерпретирует значение String как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4.

Выполняются следующие шаги:

1. Пусть S будет значением this.
2. Вернуть ? TrimString(S, start+end).
Примечание

Функция обрезки намеренно универсальна; он не требует, чтобы это значение было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

 

TrimString ( string, where )

Абстрактная операция TrimString принимает аргументы string и where. Он интерпретирует string как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4. При вызове он выполняет следующие шаги:

1. Пусть str будет ? RequireObjectCoercible(string).
2. Пусть S будем ? ToString(str).
3. Если where является началом start, пусть T будет значением String, которое является копией S с удаленным начальным пробелом.
4. В противном случае, если where является концом end, пусть T будет значением String, которое является копией S с удаленным конечным пробелом.
5. Иначе,
   a. Утверждение: где начало + конец (start+end).
   b. Пусть T будет значением String, которое является копией S с удаленными начальными и конечными пробелами.
6. Вернуть T

Определение пробела — это объединение WhiteSpace и LineTerminator. При определении того, находится ли кодовая точка Unicode в общей категории Unicode «Space_Separator» («Zs»), последовательности кодовых единиц интерпретируются как последовательности кодовых точек в кодировке UTF-16, как указано в пункте 6.1.4.

 

String.prototype.trimEnd ( )

Эта функция интерпретирует значение String как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4.

Выполняются следующие шаги:

1. Пусть S будет значением this.
2. Вернуть ? TrimString(S, end).
Примечание

Функция trimEnd намеренно носит общий характер; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.trimStart ( )

Эта функция интерпретирует значение String как последовательность кодовых точек в кодировке UTF-16, как описано в пункте 6.1.4.

Выполняются следующие шаги:

1. Пусть S будет значением this.
2. Вернуть ? TrimString(S, start).
Примечание

Функция trimStart намеренно является универсальной; она не требует, чтобы значение this было объектом String. Следовательно, её можно передать другим видам объектов для использования в качестве метода.

 

String.prototype.valueOf ( )

Когда вызывается метод valueOf, выполняются следующие шаги:

1. Вернуть ? thisStringValue(значение this).

 

String.prototype [ @@iterator ] ( )

Когда вызывается метод @@iterator, он возвращает объект Iterator (26.1.1.2), который выполняет итерацию по кодовым точкам значения String, возвращая каждую кодовую точку как значение String. Выполняются следующие шаги:

1. Пусть О будет ? RequireObjectCoercible(значение this).
2. Пусть S будем ? ToString(О).
3. Вернуть CreateStringIterator(S).

Значение свойства «name» этой функции — «[Symbol.iterator]».

 

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

Экземпляры String — это экзотические объекты String, для которых заданы внутренние методы. Экземпляры String наследуют свойства от объекта-прототипа String. У экземпляров String также есть внутренний слот [[StringData]].

Экземпляры String имеют свойство «length» и набор перечислимых свойств с именами, индексируемыми целыми числами.

length

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

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

 

Объекты итератора Cтрок

String Iterator — это объект, который представляет определенную итерацию над некоторым конкретным объектом экземпляра String. Для объектов String Iterator не существует именованного конструктора. Вместо этого объекты итератора String создаются путем вызова определенных методов объектов экземпляра String.

 

CreateStringIterator ( string )

Абстрактная операция CreateStringIterator принимает аргумент string. Эта операция используется для создания объектов итераторов для методов String, возвращающих такие итераторы. При вызове он выполняет следующие шаги:

1. Утверждение: Type(строка) - это строка String.
2. Пусть iterator будет ! OrdinaryObjectCreate(% StringIteratorPrototype%, «[[IteratedString]], [[StringNextIndex]]»).
3. Установить iterator.[[IteratedString]] на string.
4. Установить iterator.[[StringNextIndex]] на 0.
5. Вернуть iterator.

 

Объект %StringIteratorPrototype%

Объект %StringIteratorPrototype%:

  • имеет свойства, которые наследуются всеми объектами String Iterator.
  • это обычный объект.
  • имеет внутренний слот [[Prototype]], значение которого равно %IteratorPrototype%.
  • имеет следующие свойства:

%StringIteratorPrototype%.next ( )

1. Пусть O будет значением this.
2. Если Type(O) не является объектом, вызовите исключение TypeError.
3. Если O не имеет всех внутренних слотов экземпляра String Iterator (21.1.5.3), вызовите исключение TypeError.
4. Пусть S будет O.[[IteratedString]].
5. Если S не определено (является undefined), вернуть CreateIterResultObject(undefined, true).
6. Пусть позиция position будет O.[[StringNextIndex]].
7. Пусть len будет длиной S.
8. Если positionlen, то
   a. Установить O.[[IteratedString]] на undefined.
   b. Вернуть CreateIterResultObject(undefined, true).
9. Пусть cp будет ! CodePointAt(S, position).
10. Пусть nextIndex будет position + cp.[[CodeUnitCount]].
11. Пусть resultString будет подстрокой S от position до nextIndex.
12. Установить O.[[StringNextIndex]] на nextIndex.
13. Вернуть CreateIterResultObject(resultString, false).

 

%StringIteratorPrototype% [ @@toStringTag ]

Начальным значением свойства @@toStringTag является строковое значение String Iterator.

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

 

Свойства экземпляров строкового итератора

Экземпляры String Iterator — это обычные объекты, наследующие свойства от внутреннего объекта %StringIteratorPrototype%. Экземпляры String Iterator изначально создаются с внутренними слотами, перечисленными в Таблице 55.

Внутренний слот (Internal Slot) Описание (Description)
[[IteratedString]] Значение String, единицы кода которого повторяются.
[[StringNextIndex]] Целочисленный индекс следующего строкового элемента (единицы кода), проверяемого этим итератором.

 

Ссылки

Стандарт ECMAScript — Раздел «6.1.4 The String Type«- https://tc39.es/ecma262/#sec-ecmascript-language-types-string-type

ECMAScript — Официальная страница стандарта — Объекты String — https://tc39.es/ecma262/#sec-string-objects