String и Symbol
TypeScript
const someString1: string = 'Some string';
const someString2: Readonly<string> = 'Some string';
const someString3: 'Some1' | 'Some2' = 'Some1';
Строка. Любое выражение в кавычках будет строкой (одинарные, двойные, обратные - Template literals);
Строки в JS в кодировке UTF-16.
'some string';
"some string";
`some string`;
Содержимое строки в JavaScript нельзя изменить. Нельзя взять символ посередине и заменить его. Как только строка создана — она такая навсегда.
let str = 'Hi';
str[0] = 'h'; // не изменит переменную
В обратные кавычки можно вставлять ЛЮБОЙ JS-КОД.
const someVarialbe = 'SOME TEXT';
`${someVarialbe} some text`;
Даже функции
function summ (a, b) {
return a + b;
}
console.log(`Сумма: ${summ(2, 3)}`); // 'Сумма: 5'
Конкатинация
const a = 'String 1';
const b = 'String 2';
a + ' ' + b; // 'String 1 String 2' - Старый способ
`${a} ${b}`; // 'String 1 String 2' - Новый (обратные кавычки)
// Иногда возникает такая ошибка:
const a = '123';
const b = 123;
const c = a + b;
// при сложении число конвертируется в строку
console.log(c); // '123123'
Спец. символы
// пробелы после "+" не будут учитываться (поэтому можно красиво отфармотировать)
let longString1 = "This is a very long string which needs " +
"to wrap across multiple lines because " +
"otherwise my code is unreadable.";
// пробелы будут учитываться (поэтому нужно переносить на начало новой строки)
let longString2 = "This is a very long string which needs \
to wrap across multiple lines because \
otherwise my code is unreadable.";
// пробелы будут учитываться (поэтому нужно переносить на начало новой строки)
let longString3 = `This is a very long string which needs
to wrap across multiple lines because
otherwise my code is unreadable.`;
Экранирование. С помощью специальных символов (обратный слеш). Строки со спец. символами нужно сохранять в переменные.
// экранирование кавычек при испоьзовании обычных кавычек
'I\'m the JS!';
// Экранирование обратного слэша
'abc \\ abc'; // 'abc \ abc'
// Перенос строки (\n)
let str1 = "Hello World!\nThis is my string";
// Табуляция (\t)
let str2 = "Hello World!\tThis is my string";
// unicode (\uXXXX ) - кодировка UTF-16
`\u00E9`; // 'é'
Длина строки и индекс символов
Строки в JS в каком-то смысле - это массивы из символов и пробелов. На них действуют некоторые методы массивов.
'String'.length; // 6
'some text'[0]; // 's'
'some text'[11]; // 'undefined' - несуществующий символ
// 2-ой способ (устаревший)
'String'.charAt(0); // 'S'
Спец. сиволы на length не влияют
'I\'m the JS!'[1]; // "'"
Преобразование в массив и обратно
'String'.split(''); // ["S", "t", "r", "i", "n", "g"]
["S", "t", "r", "i", "n", "g"].join(''); // 'String'
Регистр
'String'.toLowerCase(); // 'string'
'String'.toUpperCase(); // 'STRING'
Поиск подстроки
Поиск с начала
'String'.indexOf('ring'); // 2 (Возвращает индекс начала подстроки)
'String'.indexOf('some'); // -1 (-1 если не найдет)
'String'.indexOf('ring', 3); // -1 (начиная я 3-го индекса)
Поиск с конца
'String'.lastIndexOf('g'); // 5
Вырезать / обрезать подстроку
'string'.slice(1, 3); // 'tr'
'String'.slice(-2); // 'ng' (вырезать с конца)
'String'.substring(1, 3); // "tr"
'String'.substr(0, 1); // 'S' (выерзать 1 символ, начиная с 0 индекса)
Заменить символ
'Ztring'.replace('Z', 'S'); // "String"
Поиск совпадений
// по началу строки
'String'.startsWith('St'); // true
// по концу строки
'String'.endsWith('ng'); // true
// по всей строке
'String'.includes('S'); // true
'String'.includes('Sr'); // false
'String'.includes('S', 0); // true (начиная с 1-го индекса)
'String'.includes('S', 1); // false (начиная с 1-го индекса)
Дублирование
'String'.repeat(2); // "StringString"
Удаление пробелов
' String '.trim(); // "String"
' String '.replace(/\s/g, ''); // "String"
Пробежаться циклом по строке
const someString = 'Some string';
for (const char of someString) {
console.log(char);
}
Сравнение строк
У каждого символа есть код, в JS сравниваются эти коды символов.
- Пустая строка всегда меньше
- У заглавных код меньше чем у строчных (так как строчные стоят правее по алфавиту)
- У кириллицы код больше
- На практике редко используется.
// ABC .. abc .. АБВ .. абв
'a'.codePointAt(0); // 97
'A'.codePointAt(0); // 65
'a' > 'A'; // true (97 > 65)
'a' > 'b'; // false (97 > 98)
Локальное сравнение
'Россия'.localeCompare('USA', 'ru'); // -1 (т.к. ru)
'Россия'.localeCompare('USA', 'en'); // 1 (т.к. en)
Конвертация числа в строку
const a = 123;
String(a); // '123'
a + ''; // '123'
`${a}`; // '123'
Symbol
Используется редко. Используются для присвоинии уникальных имен для свойств объектов или идентификаторов.
Создание и нестрогое сравнение символов.
const symbol = Symbol('mySymbol');
const symbol2 = Symbol('mySymbol');
typeof(symbol); // 'symbol'
console.log(symbol === symbol2); // false
Создание и нестрогое сравнение символов.
const symbol = Symbol.for('mySymbol');
const symbol2 = Symbol.for('mySymbol');
console.log(symbol === symbol2); // true
Создание пароля
let person = {
name: 'John',
age: 20,
[Symbol('password-closed')]: 'John123',
[Symbol.for('password-open')]: 'John321',
}
console.log(person[Symbol.for('password-closed')]); // undefined
console.log(person[Symbol.for('password-open')]); // 'John321'
Посмотреть все сиволы, которые есть в объекте
console.log(Object.getOwnPropertySymbols(person)); // (2) [Symbol(password-closed), Symbol(password-open)]
Локализация
// ['Вася, Петя, Маша'] --> 'Вася, Петя и Маша'
new Intl.ListFormat('ru').format(['Вася, Петя, Маша'])