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()`:


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


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


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


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

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

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


```js
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 автоматически оборачивает строковый примитив объектом и вызывает на нём метод или ищет в нём свойство.


```js
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` трактуются так же, как и все остальные объекты, а именно: возвращается сам объект. Например:


```js
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()`.


```js
console.log(eval(s2.valueOf())); // выведет число 4
```

Свойства
--------

`String.length`

Хранит длину строки. Только для чтения.

Методы
------

`String.fromCharCode()`

Возвращает строку, созданную из указанной последовательности значений Юникода.

`String.fromCodePoint()` 
Экспериментальная возможность

Возвращает строку, созданную из указанной последовательности кодовых точек Юникода.

`String.raw()` 
Экспериментальная возможность

Возвращает строку, созданную из сырой шаблонной строки.

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

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


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


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

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


```js
/\*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` можно использовать как «безопасную» альтернативу методу `toString()`, так как хотя он обычно и вызывает соответствующий метод `toString()`, он также работает и для значений `null` и `undefined`. Например:


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

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-string-objects |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `DOMString`
* Двоичные строки