Возвращает объект Array, в котором были сохранены подстроки результата преобразования строки string в String. Подстроки определяются путем поиска слева направо совпадений с регулярным выражением значения this; эти вхождения не являются частью какой-либо строки в возвращаемом массиве, но служат для разделения значения String.
Значение this может быть пустым регулярным выражением или регулярным выражением, которое может соответствовать пустой Строке. В этом случае регулярное выражение не соответствует пустой подстроке в начале или конце входной строки, а также не соответствует пустой подстроке в конце предыдущего совпадения разделителя. (Например, если регулярное выражение соответствует пустой строке, строка разбивается на отдельные элементы кодовой единицы; длина результирующего массива равна длине строки, и каждая подстрока содержит одну кодовую единицу.) Только первое совпадение по заданному индексу String рассматривается, даже если обратное отслеживание может привести к непустому совпадению подстроки по этому индексу. (Например, /a*?/[Symbol.split]("ab")
оценивается как массив ["a", "b"]
, в то же время /a*/[Symbol.split]("ab")
оценивается как массив ["", "b"]
.)
Если строка string является пустой строкой (или преобразуется в нее), результат зависит от того, может ли регулярное выражение соответствовать пустой Строке. Если это возможно, результирующий массив не содержит элементов. В противном случае результирующий массив будет содержать один элемент — пустую Строку.
Если регулярное выражение содержит «захватывающие скобки» (capturing parentheses), то каждый раз, когда сопоставляется разделитель separator, результаты (включая любые неопределенные результаты undefined) захватывающих скобок вставляются в выходной массив. Например,
/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")
оценивает массив
["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]
Если limit не является undefined, выходной массив усекается так, чтобы он содержал не более элементов limit.
Когда вызывается метод разделения @@split
, выполняются следующие шаги:
1. Пусть rx будет значением этого this. 2. Если тип Type(rx) не является Object, выбросить исключение TypeError. 3. Пусть S будет ? ToString(string). 4. Пусть C будет ? SpeciesConstructor(rx, %RegExp%). 5. Пусть flags будут ? ToString(? Get(rx, "flags")). 6. Если flags содержит "u", пусть unicodeMatching будет истинным true. 7. В противном случае пусть unicodeMatching будет false. 8. Если flags содержит "y", пусть newFlags будет флагами flags. 9. Иначе, пусть newFlags будет конкатенацией строк из флагов flags и "y". 10. Пусть splitter будет ? Построить Construct(C, «rx, newFlags»). 11. Пусть А будет ! ArrayCreate(0). 12. Пусть lengthA равно 0. 13. Если limit является undefined (не определен), пусть lim будет 232 - 1; иначе пусть lim будет ℝ(? ToUint32(limit)). 14. Если lim равен 0, вернуть A. 15. Пусть size будет длиной S. 16. Если размер size равен 0, то а. Пусть z будет ? RegExpExec(splitter, S). b. Если z не является null, верните A. c. Выполнить ! CreateDataPropertyOrThrow(A, "0", S). d. Вернуть А. 17. Пусть p равно 0. 18. Пусть q равно p. 19. Повторите, пока q < size, а. Выполнить ? Установить Set(splitter, "lastIndex", 𝔽(q), true). b. Пусть z будет ? RegExpExec(splitter, S). c. Если z равно нулю, установите q равным AdvanceStringIndex(S, q, unicodeMatching). d. Иначе, i. Пусть e будет ℝ(? ToLength(? Get(splitter, "lastIndex"))). ii. Установите для e значение min(e, size). iii. Если e = p, установите q равным AdvanceStringIndex(S, q, unicodeMatching). iv. Иначе, 1. Пусть T - подстрока S от p до q. 2. Выполните ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T). 3. Установите lengthA на lengthA + 1. 4. Если lengthA = lim, вернуть A. 5. Установите p на e. 6. Пусть numberOfCaptures будет ? LengthOfArrayLike(z). 7. Установите для numberOfCaptures значение max(numberOfCaptures - 1, 0). 8. Пусть i равно 1. 9. Повторите, пока i ≤ numberOfCaptures, а. Пусть nextCapture будет ? Получите Get(z, ! ToString(𝔽(i))). b. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), nextCapture). c. Установите i в i + 1. d. Установите lengthA на lengthA + 1. е. Если lengthA = lim, вернуть A. 10. Установите q на p. 20. Пусть T будет подстрокой S от p до size. 21. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T). 22. Вернуть А.
Значение свойства «name» этой функции — «[Symbol.split]«.
Метод @@split
игнорирует значение «global» и «sticky» свойств этого объекта RegExp.
Информационные ссылки
Предыдущий раздел — ECMAScript | get RegExp.prototype.source
Стандарт ECMAScript — Раздел «RegExp.prototype [ @@split ] ( string, limit )» — https://tc39.es/ecma262/#sec-regexp.prototype-@@split
ECMAScript | Условные обозначения
ECMAScript | Свойства объекта-прототипа Регулярных Выражений