Глава 3.9. Строки: встроенный объект String

Объект String — это объектная реализация примитивного строкового значения. Его конструктор имеет вид:

new String(значение?)

Здесь значение — любое строковое выражение, задающее примитивное значение объекта. Если оно не указано, то примитивное значение объекта равно "".

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

Помимо методов, предусмотренных стандартом ECMAScript, обозреватели Microscape традиционно поддерживают несколько методов объекта String, обеспечивающих заключение строки в теги HTML. Эти методы также описаны ниже.

Свойства объекта String
Свойство Описание Член прототипа
constructor Конструктор, который создал объект. Да
length Количество символов в строке. Нет
prototype Ссылка на прототип класса объектов. Нет
Стандартные методы объекта String
Метод Описание Член прототипа
charAt Возвращает символ, находящийся в данной позиции строки. Да
charCodeAt Возвращает код символа, находящегося в данной позиции строки. Да
concat Возвращает конкатенацию строк. Да
fromCharCode Создает строку из символов, заданных кодами Unicode. Да
indexOf Возвращает позицию первого вхождения заданной подстроки. Да
lastIndexOf Возвращает позицию последнего вхождения заданной подстроки. Да
localeCompare Сравнивает две строки с учетом языка операционной системы. Да
match Сопоставляет строку с регулярным выражением. Да
replace Сопоставляет строку с регулярным выражением и заменяет найденную подстроку новой подстрокой. Да
search Ищет сопоставление строки с регулярным выражением. Да
slice Извлекает часть строки и возвращает новую строку. Да
split Разбивает строку на массив подстрок. Да
substr Возвращает подстроку, заданную позицией и длиной. Да
substring Возвращает подстроку, заданную начальной и конечной позициями. Да
toLocaleLowerCase Преобразует все буквы строки в строчные с учетом языка операционной системы. Да
toLocaleUpperCase Преобразует все буквы строки в прописные с учетом языка операционной системы. Да
toLowerCase Преобразует все буквы строки в строчные. Да
toString Преобразует объект в строку. Да
toUpperCase Преобразует все буквы строки в прописные. Да
valueOf Возвращает примитивное значение объекта. Да
Нестандартные методы объекта String
Метод Описание Член прототипа
anchor Создает закладку HTML (<A NAME="имя">…</A>). Да
big Заключает строку в теги <BIG>…</BIG>. Да
blink Заключает строку в теги <BLINK>…</BLINK>. Да
bold Заключает строку в теги <B>…</B>. Да
fixed Заключает строку в теги <TT>…</TT>. Да
fontcolor Заключает строку в теги <FONT COLOR="цвет">…</FONT>. Да
fontsize Заключает строку в теги <FONT SIZE="размер">…</FONT>. Да
italics Заключает строку в теги <I>…</I>. Да
link Создает гиперссылку HTML (<A HREF="uri">…</A>). Да
small Заключает строку в теги <SMALL>…</SMALL>. Да
strike Заключает строку в теги <STRIKE>…</STRIKE>. Да
sub Заключает строку в теги <SUB>…</SUB>. Да
sup Заключает строку в теги <SUP>…</SUP>. Да

Свойство length

Синтаксис: объект.length
Атрибуты:  { DontEnum, DontDelete, ReadOnly }

Значением свойства length является количество символов в строке. Для пустой строки это значение равно нулю.

Метод anchor

Синтаксис: объект.anchor(имя)
Аргументы: имя — любое строковое выражение
Результат: строковое значение

Метод anchor возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <A NAME="имя">…</A>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для создания в HTML-документе закладки с заданным именем. Например, оператор document.write("Мой текст".anchor("Закладка")) эквивалентен оператору document.write('<A NAME="Закладка">Мой текст</A>').

Метод big

Синтаксис: объект.big()
Результат: строковое значение

Метод big возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <BIG>…</BIG>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста крупным шрифтом. Например, оператор document.write("Мой текст".big()) выведет на экран обозревателя строку Мой текст.

Метод blink

Синтаксис: объект.blink()
Результат: строковое значение

Метод blink возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <BLINK>…</BLINK>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста мигающим шрифтом. Указанные теги не входят в стандарт HTML и поддерживаются только обозревателями Netscape и WebTV. Например, оператор document.write("Мой текст".blink()) выведет на экран обозревателя строку Мой текст.

Метод bold

Синтаксис: объект.bold()
Результат: строковое значение

Метод bold возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <B>…</B>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста полужирным шрифтом. Например, оператор document.write("Мой текст".bold()) выведет на экран обозревателя строку Мой текст.

Метод charAt

Синтаксис: объект.charAt(позиция)
Аргументы: позиция — любое числовое выражение
Результат: строковое значение

Метод charAt возвращает строку, состоящую из символа, расположенного в данной позиции примитивного значения строкового объекта. Позиции символов строки нумеруются от нуля до объект.length-1. Если позиция лежит вне этого диапазона, то возвращается пустая строка. Например, оператор document.write("Строка".charAt(0)) выведет на экран обозревателя символ С.

Метод charCodeAt

Синтаксис: объект.charCodeAt(позиция)
Аргументы: позиция — любое числовое выражение
Результат: числовое значение

Метод charAt возвращает число, равную коду Unicode символа, расположенного в данной позиции примитивного значения строкового объекта. Позиции символов строки нумеруются от нуля до объект.length-1. Если позиция лежит вне этого диапазона, то возвращается NaN. Например, оператор document.write("Строка".charCodeAt(0).toString(16)) выведет на экран обозревателя шестнадцатеричный код русской буквы "С": 421.

WDH+ О возможных проблемах см. WDH+: ANSI и Unicode.

Метод concat

Синтаксис: объект.concat(строка0, строка1, …, строкаN)
Аргументы: строка0, строка1, …, строкаN — любые строковые выражения
Результат: строковое значение

Метод concat возвращает новую строку, являющуюся конкатенацией исходной строки и аргументов метода. Этот метод эквивалентен операции

объект + строка0 + строка1 + … + строкаN

Например, оператор document.write("Мороз и солнце. ".concat("День чудесный.")) выведет на экран обозревателя строку Мороз и солнце. День чудесный.

Метод fixed

Синтаксис: объект.fixed()
Результат: строковое значение

Метод fixed возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <TT>…</TT>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста телетайпным шрифтом. Например, оператор document.write("Мой текст".fixed()) выведет на экран обозревателя строку Мой текст.

Метод fontcolor

Синтаксис: объект.fontcolor(цвет)
Аргументы: цвет — строковое выражение
Результат: строковое значение

Метод fontcolor возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <FONT COLOR=цвет>…</FONT>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста заданным цветом. Например, оператор document.write("Мой текст".fontcolor("red")) выведет на экран обозревателя строку Мой текст.

Метод fontsize

Синтаксис: объект.fontsize(размер)
Аргументы: размер — числовое выражение
Результат: строковое значение

Метод fontsize возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <FONT SIZE="размер">…</FONT>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста шрифтом заданного размера. Например, оператор document.write("Мой текст".fontsize(5)) выведет на экран обозревателя строку Мой текст.

Метод fromCharCode

Синтаксис: String.fromCharCode(код1, код2, …, кодN)
Аргументы: код1, код2, …, кодN — числовые выражения
Результат: строковое значение

Метод fromCharCode создает новую строку (но не строковый объект), которая является конкатенацией символов Unicode с кодами код1, код2, …, кодN.

Это статический метод объекта String, поэтому для доступа к нему не нужно специально создавать строковый объект. Пример:

var s = String.fromCharCode(65, 66, 67);	// s равно "ABC"

Метод indexOf

Синтаксис: объект.indexOf(подстрока [,начало]?)
Аргументы: подстрока — любое строковое выражение
           начало — любое числовое выражение
Результат: числовое значение

Метод indexOf возвращает первую позицию подстроки в примитивном значении строкового объекта. Позиции символов строки нумеруются от нуля до объект.length-1. Если задан необязательный аргумент начало, то поиск ведется, начиная с позиции начало; если нет, то с позиции 0, т. е. с первого символа строки. Если начало отрицательно, то оно принимается равным нулю; если начало больше, чем объект.length-1, то оно принимается равным объект.length-1. Если объект не содержит данной подстроки, то возвращается значение -1.

Поиск ведется слева направо. В остальном этом метод идентичен методу lastIndexOf. Следующий пример подсчитывает количество вхождений подстроки pattern в строку str.

function occur(str, pattern) {
  var pos = str.indexOf(pattern);
  for (var count = 0; pos != -1; count++)
    pos = str.indexOf(pattern, pos + pattern.length);
  return count;
}

Метод italics

Синтаксис: объект.italics()
Результат: строковое значение

Метод italics возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <I>…</I>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста курсивным шрифтом. Например, оператор document.write("Мой текст".italics()) выведет на экран обозревателя строку Мой текст.

Метод lastIndexOf

Синтаксис: объект.lastIndexOf(подстрока [,начало]?)
Аргументы: подстрока — любое строковое выражение
           начало — любое числовое выражение
Результат: числовое значение

Метод lastIndexOf возвращает последнюю позицию подстроки в примитивном значении строкового объекта. Позиции символов строки нумеруются от нуля до объект.length-1. Если задан необязательный аргумент начало, то поиск ведется, начиная с позиции начало; если нет, то с позиции 0, т. е. с первого символа строки. Если начало отрицательно, то оно принимается равным нулю; если начало больше, чем объект.length-1, то оно принимается равным объект.length-1. Если объект не содержит данной подстроки, то возвращается значение -1.

Поиск ведется справа налево. В остальном этом метод идентичен методу indexOf. Пример:

var n = "Белый кит".lastIndexOf("кит");	// n равно 6

Метод link

Синтаксис: объект.link(uri)
Аргументы: uri — любое строковое выражение
Результат: строковое значение

Метод link возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <A HREF="uri">…</A>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для создания в HTML-документе гиперссылки с заданным uri. Например, оператор document.write("Мой текст".link("#Закладка")) эквивалентен оператору document.write('<A HREF="#Закладка">Мой текст</A>').

Метод localeCompare

Синтаксис: объект.localeCompare(строка1)
Аргументы: строка1 — любое строковое выражение
Результат: число
Поддержка: Internet Explorer Поддерживается с версии 5.5.
           Netscape Navigator Не поддерживается.

Метод localeCompare сравнивает две строки с учетом национальных установок операционной системы. Он возвращает -1, если примитивное значение объекта меньше строки1, +1, если оно больше строки1, и 0, если эти значения совпадают.

Метод match

Синтаксис: объект.match(регвыр)
Аргументы: регвыр — любое регулярное выражение
Результат: массив строк

Метод match сопоставляет регулярное выражение регвыр с примитивным значением строкового объекта. Результатом сопоставления является массив найденных подстрок или null, если соответствий нет. При этом:

  • Если регвыр не содержит опцию глобального поиска, то выполняется метод регвыр.exec(объект) и возвращается его результат. Результирующий массив содержит в элементе с индексом 0 найденную подстроку, а в остальных элементах — подстроки, соответствующие подвыражениям регвыр, заключенным в круглые скобки.
  • Если регвыр содержит опцию глобального поиска, то метод регвыр.exec(объект) выполняется до тех пор, пока находятся соответствия. Если n — количество найденных соответствий, то результатом является массив из n элементов, которые содержат найденные подстроки. Свойству регвыр.lastIndex присваивается номер позиции в исходной строке, указывающий на первый символ после последнего найденного соответствия, или 0, если соответствий не найдено.

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

var src = "Он сказал: <I>Я ухожу</I> и добавил: <I>До свидания</I>.";
var res = src.match(/<i>.*?<\/i>/i);	// res = ["<I>Я ухожу</I>"]
var res = src.match(/<i>.*?<\/i>/ig);	// res = ["<I>Я ухожу</I>", "<I>До свидания</I>"]

Метод replace

Синтаксис: объект.replace(регвыр,строка)
           объект.replace(регвыр,функция)
Аргументы: регвыр — регулярное выражение
           строка — строковое выражение
           функция — имя функции или декларация функции
Результат: новая строка

Метод replace сопоставляет регулярное выражение регвыр с примитивным значением строкового объекта и заменяет найденные подстроки другими подстроками. Результатом является новая строка, которая является копией исходной строки с проведенными заменами. Способ замены определяется опцией глобального поиска в регвыр и типом второго аргумента.

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

Если вторым аргументом является строка, то замена каждой найденной подстроки производится на нее. При этом строка может содержать такие свойства объекта RegExp, как $1, …, $9, lastMatch, lastParen, leftContext и rightContext. Например, оператор document.write("Вкусные яблоки, сочные яблоки.".replace(/яблоки/g, "груши")) выведет на экран обозревателя строку Вкусные груши, сочные груши.

Если вторым аргументом является функция, то замена каждой найденной подстроки производится вызовом этой функции. Функция имеет следующие аргументы. Первый аргумент — это найденная подстрока, затем следуют аргументы, соответствующие всем подвыражениям регвыр, заключенным в круглые скобки, предпоследний аргумент — это позиция найденной подстроки в исходной строке, считая с нуля, и последний аргумент— это сама исходная строка. Следующий пример показывает, как с помощью метода replace можно написать функцию преобразования градусов Фаренгейта в градусы Цельсия. Приведенный сценарий

function myfunc($0,$1) {
  return (($1-32) * 5 / 9) + "C";
}
function f2c(x) {
  var s = String(x);
  return s.replace(/(\d+(\.\d*)?)F\b/, myfunc);
}
document.write(f2c("212F"));

выведет на экран обозревателя строку 100C.

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

Метод search

Синтаксис: объект.search(регвыр)
Аргументы: регвыр — любое регулярное выражение
Результат: числовое выражение

Метод search сопоставляет регулярное выражение регвыр с примитивным значением строкового объекта. Результатом сопоставления является позиция первой найденной подстроки, считая с нуля, или -1, если соответствий нет. При этом опция глобального поиска в регвыр игнорируется, и свойства регвыр не изменяются. Примеры:

var src = "Он сказал: <I>Я ухожу</I> и добавил: <I>До свидания</I>.";
var n = src.search(/<i>.*?<\/i>/i);	// n равно 11

Метод slice

Синтаксис: объект.slice(начало [,конец]?)
Аргументы: начало и конец — любые числовые выражения
Результат: новая строка

Метод slice возвращает подстроку примитивного значения строкового объекта, от позиции начало до позиции конец, не включая ее. Если конец не задан, то возвращается подстрока, начиная с позиции начало и до конца исходной строки.

Позиции символов строки нумеруются от нуля до объект.length-1. Если значение начало отрицательно, то оно заменяется на объект.length+начало. Если значение конец отрицательно, то оно заменяется на объект.length+конец. Иными словами, отрицательные аргументы трактуются как смещения от конца строки.

Результатом является строковое значение, а не строковый объект. Например, оператор document.write("ABCDEF".slice(2,-1)) выведет на экран обозревателя строку CDE.

Метод small

Синтаксис: объект.small()
Результат: строковое значение

Метод small возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <SMALL>…</SMALL>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста мелким шрифтом. Например, оператор document.write("Мой текст".small()) выведет на экран обозревателя строку Мой текст.

Метод split

Синтаксис: объект.split(разделитель [,число]?)
Аргументы: разделитель — строковое или регулярное выражение
           число — числовое выражение
Результат: массив строк (объект Array)

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

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

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

  • Если разделитель не задан, то результирующий массив состоит из одного элемента, равного исходной строке.
  • Если разделитель — пустая строка или регулярное выражение, соответствующее пустой строке, то результирующий массив состоит из объект.length элементов, каждый из которых содержит один символ исходной строки.
  • Если разделитель — регулярное выражение, то очередная подстрока выделяется всякий раз, когда нашлось соответствие регулярному выражению, и соответствующая подстрока служит разделителем. Например, оператор var s = "a1b2c3d".split(/\d/); вернет массив ["a", "b", "c", "d"].

В следующем примере регулярное выражение используется для задания тегов HTML в качестве разделителя. Оператор

document.write("Текст <B>полужирный</B> и <EM>курсивный</EM>".split(/<\/?([^<>]+)>/));

выведет на экран обозревателя строку Текст ,полужирный, и ,курсивный.

Метод strike

Синтаксис: объект.strike()
Результат: строковое значение

Метод strike возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <STRIKE>…</STRIKE>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста перечеркнутым шрифтом. Например, оператор document.write("Мой текст".strike()) выведет на экран обозревателя строку Мой текст.

Метод sub

Синтаксис: объект.sub()
Результат: строковое значение

Метод sub возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <SUB>…</SUB>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста как нижнего индекса. Например, оператор document.write("Мой текст".sub()) выведет на экран обозревателя строку Мой текст.

Метод substr

Синтаксис: объект.substr(позиция [,длина]?)
Аргументы: позиция и длина — числовые выражения
Результат: строковое значение

Метод substr возвращает подстроку примитивного значения строкового объекта, начинающуюся с данной позиции и содержащую длина символов. Если длина не задана, то возвращается подстрока, начиная с данной позиции и до конца исходной строки. Если длина отрицательна или равна нулю, то возвращается пустая строка.

Позиции символов строки нумеруются от нуля до объект.length-1. Если позиция больше или равна объект.length, то возвращается пустая строка. Если позиция отрицательна, то она трактуется как смещение от конца строки, т. е. заменяется на объект.length+позиция.

Примечание. Если позиция отрицательна, то Internet Explorer ошибочно заменяет ее на 0, поэтому в целях совместимости этот вариант использовать не следует.

Результатом является строковое значение, а не строковый объект. Примеры:

var src = "abcdef";
var s1 = src.substr(1, 3);	// "bcd"
var s2 = src.substr(1);		// "bcdef"
var s3 = src.substr(-1);	// "f", но в MSIE: "abcdef"

Метод substring

Синтаксис: объект.substring(начало [,конец])
Аргументы: начало и конец — числовые выражения
Результат: строковое значение

Метод substring возвращает подстроку примитивного значения строкового объекта, от позиции начало до позиции конец, не включая ее. Если конец не задан, то возвращается подстрока, начиная с позиции начало и до конца исходной строки.

Позиции символов строки нумеруются от нуля до объект.length-1. Отрицательные аргументы или равные NaN заменяются на нуль; если аргумент больше длины исходной строки, то он заменяется на нее. Если начало больше конца, то они меняются местами. Если начало равно концу, то возвращается пустая строка.

Результатом является строковое значение, а не строковый объект. Примеры:

var src = "abcdef";
var s1 = src.substring(1, 3);	// "bc"
var s2 = src.substring(1, -1);	// "a"
var s3 = src.substring(-1, 1);	// "a"

Метод sup

Синтаксис: объект.sup()
Результат: строковое значение

Метод sup возвращает строку, состоящую из примитивного значения строкового объекта, заключенного в теги <SUP>…</SUP>. Проверки на то, не была ли исходная строка уже заключена в эти теги, не делается. Этот метод используется совместно с методами document.write и document.writeln для отображения текста как верхнего индекса. Например, оператор document.write("Мой текст".sup()) выведет на экран обозревателя строку Мой текст.

Метод toLocaleLowerCase

Синтаксис: объект.toLocaleLowerCase()
Результат: новая строка
Поддержка: Internet Explorer Поддерживается с версии 5.5.
           Netscape Navigator Не поддерживается.

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

Метод toLocaleUpperCase

Синтаксис: объект.toLocaleUpperCase()
Результат: новая строка
Поддержка: Internet Explorer Поддерживается с версии 5.5.
           Netscape Navigator Не поддерживается.

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

Метод toLowerCase

Синтаксис: объект.toLowerCase()
Результат: новая строка

Метод toLowerCase возвращает новую строку, в которой все буквы исходной строки заменены на строчные. Остальные символы исходной строки не изменяются. Исходная строка остается прежней. Например, оператор document.write("объект String".toUpperCase()) выведет на экран обозревателя строку объект string.

Метод toString

Синтаксис: объект.toString()
Результат: строковое значение

Метод toString возвращает примитивное значение строкового объекта.

Метод toUpperCase

Синтаксис: объект.toUpperCase()
Результат: новая строка

Метод toUpperCase возвращает новую строку, в которой все буквы исходной строки заменены на прописные. Остальные символы исходной строки не изменяются. Исходная строка остается прежней. Например, оператор document.write("объект String".toUpperCase()) выведет на экран обозревателя строку ОБЪЕКТ STRING.

Метод valueOf

Синтаксис: объект.valueOf()
Результат: строковое значение

Метод valueOf возвращает примитивное значение строкового объекта.

HIVE: All information for read only. Please respect copyright!
Advertising:
Hosted by hive
йца: йХЕБЯЙЮЪ ЦНПНДЯЙЮЪ АХАКХНРЕЙЮ