String

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

Синтаксис

Строковые литералы могут быть следующих форм:

'строка текста'
"строка текста"
"中文 español English हिन्दी العربية português বাংলা русский 日本語 ਪੰਜਾਬੀ 한국어 தமிழ்"

Кроме регулярных печатных символов можно использовать специальные символы, которые можно закодировать, используя нотацию escape-последовательностей:

Код Вывод
\0 нулевой символ (символ NUL)
\' одинарная кавычка
\" двойная кавычка
\\ обратный слеш
\n новая строка
\r возврат каретки
\v вертикальная табуляция
\t табуляция
\b забой
\f подача страницы
\uXXXX кодовая точка Юникода
\xXX символ из кодировки Latin-1

Либо можно использовать глобальный объект String напрямую:

String(thing)
new String(thing)

Параметры

thing
Всё, что может быть преобразовано в строку.

Описание

Строки полезны для хранения данных, которые можно представить в текстовой форме. Некоторые из наиболее частых операций со строками — это проверка их длины, построение строки с помощью операций строковой конкатенации + и +=, проверка на существование или местоположение подстрок с помощью метода indexOf(), либо извлечение подстрок с помощью метода substring().

Доступ к символам

Существует два способа добраться до конкретного символа в строке. В первом способе используется метод charAt():

return 'кот'.charAt(1); // вернёт "о"

Другим способом (введённым в ECMAScript 5) является рассмотрение строки как массивоподобного объекта, в котором символы имеют соответствующие числовые индексы:

return 'кот'[1]; // вернёт "о"

При доступе к символам посредством нотации с квадратными скобками, попытка удалить символ, или присвоить значение числовому свойству закончится неудачей, поскольку эти свойства являются незаписываемыми и ненастраиваемыми. Смотрите документацию по методу Object.defineProperty() для дополнительной информации.

Сравнение строк

Разработчики на C имеют для сравнения строк функцию strcmp(). В JavaScript вы просто используете операторы меньше и больше:

var a = 'a';
var b = 'b';
if (a < b) { // true
  print(a + ' меньше чем ' + b);
} else if (a > b) {
  print(a + ' больше чем ' + b);
} else {
  print(a + ' и ' + b + ' равны.');
}

Подобный результат также может быть достигнут путём использования метода localeCompare(), имеющегося у всех экземпляров String.

Разница между строковыми примитивами и объектами String

Обратите внимание, что JavaScript различает объекты String и значения строкового примитива (то же самое верно и для объектов Boolean и Number).

Строковые литералы (обозначаемые двойными или одинарными кавычками) и строки, возвращённые вызовом String в неконструкторном контексте (то есть, без использования ключевого слова new) являются строковыми примитивами. JavaScript автоматически преобразует примитивы в объекты String, так что на строковых примитивах возможно использовать методы объекта String. В контекстах, когда на примитивной строке вызывается метод или происходит поиск свойства, JavaScript автоматически оборачивает строковый примитив объектом и вызывает на нём метод или ищет в нём свойство.

var s_prim = 'foo';
var s_obj = new String(s_prim);

console.log(typeof s_prim); // выведет 'string'
console.log(typeof s_obj);  // выведет 'object'

Строковые примитивы и объекты String также дают разные результаты при использовании глобальной функции eval(). Примитивы, передаваемые в eval(), трактуются как исходный код; объекты же String трактуются так же, как и все остальные объекты, а именно: возвращается сам объект. Например:

var s1 = '2 + 2';             // создаёт строковый примитив
var s2 = new String('2 + 2'); // создаёт объект String
console.log(eval(s1));        // выведет число 4
console.log(eval(s2));        // выведет строку '2 + 2'

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

Объект String также всегда может быть преобразован в его примитивный аналог при помощи метода valueOf().

console.log(eval(s2.valueOf())); // выведет число 4
Примечание: для того, чтобы узнать больше о другом возможном подходе к строкам в JavaScript, прочитайте статью о StringView — C-подобном представлении строк на основе типизированных массивов.

Свойства

String.prototype
Позволяет добавлять свойства к объекту String.
Свойства, унаследованные из Function:

Методы

String.fromCharCode()
Возвращает строку, созданную из указанной последовательности значений Юникода.
String.fromCodePoint() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Возвращает строку, созданную из указанной последовательности кодовых точек Юникода.
String.raw() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Возвращает строку, созданную из сырой шаблонной строки.
Методы, унаследованные из Function:

Общие методы объекта String

Методы экземпляров String также доступны в Firefox как часть JavaScript 1.6 (который не является частью стандарта ECMAScript) на объекте String, что позволяет применять эти методы к любому объекту:

var num = 15;
console.log(String.replace(num, /5/, '2'));

Общие методы также доступны для объекта Array.

Следующая прослойка позволяет использовать их во всех браузерах:

/*globals define*/
// Предполагаем, что все требуемые методы экземпляров String уже присутствуют
// (для них так же можно использовать полифилы, если их нет)
(function() {
  'use strict';

  var i,
    // Мы могли построить массив методов следующим образом, однако метод
    //   getOwnPropertyNames() нельзя реализовать на JavaScript:
    // Object.getOwnPropertyNames(String).filter(function(methodName) {
    //   return typeof String[methodName] === 'function';
    // });
    methods = [
      'quote', 'substring', 'toLowerCase', 'toUpperCase', 'charAt',
      'charCodeAt', 'indexOf', 'lastIndexOf', 'startsWith', 'endsWith',
      'trim', 'trimLeft', 'trimRight', 'toLocaleLowerCase',
      'toLocaleUpperCase', 'localeCompare', 'match', 'search',
      'replace', 'split', 'substr', 'concat', 'slice'
    ],
    methodCount = methods.length,
    assignStringGeneric = function(methodName) {
      var method = String.prototype[methodName];
      String[methodName] = function(arg1) {
        return method.apply(arg1, Array.prototype.slice.call(arguments, 1));
      };
    };

  for (i = 0; i < methodCount; i++) {
    assignStringGeneric(methods[i]);
  }
}());

Экземпляры объекта String

Свойства

String.prototype.constructor
Определяет функцию, создающую прототип этого объекта.
String.prototype.length
Отражает длину строки.
N
Используется для доступа к символу в позиции N, где N — это целое число между 0 и длиной строки length минус один. Эти свойства доступны только для чтения.

Методы

Методы, не относящиеся к HTML

String.prototype.charAt()
Возвращает символ по указанному индексу.
String.prototype.charCodeAt()
Возвращает число, представляющее значение символа в Юникоде по указанному индексу.
String.prototype.codePointAt() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Возвращает неотрицательное целое число, представляющее закодированную в UTF-16 кодовую точку значения по указанной позиции.
String.prototype.concat()
Объединяет текст двух строк и возвращает новую строку.
String.prototype.includes() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Определяет, находится ли строка внутри другой строки.
String.prototype.endsWith() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Определяет, заканчивается ли строка символами другой строки.
String.prototype.indexOf()
Возвращает индекс первого вхождения указанного значения в объекте String, на котором был вызван этот метод, или -1, если вхождений нет.
String.prototype.lastIndexOf()
Возвращает индекс последнего вхождения указанного значения в объекте String, на котором был вызван этот метод, или -1, если вхождений нет.
String.prototype.localeCompare()
Возвращает число, указывающее, находится ли образцовая строка до, после или на том же самом месте, что и указанная строка в порядке сортировки.
String.prototype.match()
Используется для сопоставления строке регулярного выражения.
String.prototype.matchAll()
Возвращает итератор по всем результатам при сопоставлении строки с регулярным выражением.
String.prototype.normalize() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Возвращает форму нормализации Юникода для строкового значения.
String.prototype.quote() Этот API вышел из употребления и его работа больше не гарантируется.
Оборачивает строку в двойные кавычки (""").
String.prototype.repeat() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Возвращает строку. состоящую из элементов объекта, повторённых указанное количество раз.
String.prototype.replace()
Используется для сопоставления строке регулярного выражения и для замены совпавшей подстроки на новую подстроку.
String.prototype.search()
Выполняет поиск совпадения регулярного выражения со строкой.
String.prototype.slice()
Извлекает часть строки и возвращает новую строку.
String.prototype.split()
Разбивает объект String на массив строк, разделённых указанной строкой на подстроки.
String.prototype.startsWith() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Определяет, начинается ли строка символами другой строки.
String.prototype.substr()
Возвращает указанное количество символов в строке, начинающихся с указанной позиции.
String.prototype.substring()
Возвращает символы в строке между двумя индексами.
String.prototype.toLocaleLowerCase()
Приводит символы в строке к нижнему регистру согласно текущей локали. Для большинства языков, метод делает то же самое, что и метод toLowerCase().
String.prototype.toLocaleUpperCase()
Приводит символы в строке к верхнему регистру согласно текущей локали. Для большинства языков, метод делает то же самое, что и метод toUpperCase().
String.prototype.toLowerCase()
Возвращает строковое значение с символами в нижнем регистре.
String.prototype.toSource() Это API не было стандартизировано.
Возвращает литерал объекта, представляющий указанный объект; вы можете использовать это значение для создания нового объекта. Переопределяет метод Object.prototype.toSource().
String.prototype.toString()
Возвращает строковое представление указанного объекта. Переопределяет метод Object.prototype.toString().
String.prototype.toUpperCase()
Возвращает строковое значение с символами в верхнем регистре.
String.prototype.trim()
Обрезает пробельные символы в начале и в конце строки. Часть стандарта ECMAScript 5.
String.prototype.trimLeft() Это API не было стандартизировано.
Обрезает пробельные символы с левой стороны строки.
String.prototype.trimRight() Это API не было стандартизировано.
Обрезает пробельные символы с правой стороны строки.
String.prototype.valueOf()
Возвращает примитивное значение указанного объекта. Переопределяет метод Object.prototype.valueOf().
String.prototype[@@iterator]() Это экспериментальное API, которое не должно использоваться в рабочем коде.
Возвращает новый объект итератора Iterator, который итерируется по кодовым точкам строки и возвращает каждую кодовую точку в виде строкового значения.

Методы-обёртки HTML

Эти методы имеют ограниченное применение, поскольку они представляют только ограниченное подмножество доступных тегов и атрибутов HTML.

String.prototype.anchor() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<a name="имя"> (цель гипертекста)
String.prototype.big() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<big> (en-US)
String.prototype.blink() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<blink> (en-US)
String.prototype.bold() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<b>
String.prototype.fixed() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<tt> (en-US)
String.prototype.fontcolor() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<font color="цвет">
String.prototype.fontsize() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<font size="размер">
String.prototype.italics() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<i> (en-US)
String.prototype.link() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<a href="url"> (ссылка на URL)
String.prototype.small() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<small> (en-US)
String.prototype.strike() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<strike> (en-US)
String.prototype.sub() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать. }
<sub> (en-US)
String.prototype.sup() Это устаревшее API больше не должно использоваться, но оно по-прежнему может работать.
<sup> (en-US)

Примеры

Пример: преобразование в строку

Объект String можно использовать как «безопасную» альтернативу методу toString(), так как хотя он обычно и вызывает соответствующий метод toString(), он также работает и для значений null и undefined. Например:

var outputStrings = [];
for (var i = 0, n = inputValues.length; i < n; ++i) {
  outputStrings.push(String(inputValues[i]));
}

Спецификации

Спецификация Статус Комментарии
ECMAScript 1-е издание. Стандарт Изначальное определение.
ECMAScript 5.1 (ECMA-262)
Определение 'String' в этой спецификации.
Стандарт
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'String' в этой спецификации.
Стандарт

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также