Строки, числа и Intl
Методы на каждый день, ловушки чисел с плавающей точкой и правильное форматирование.
Обновлено
Что такое строка
Строка (string) — последовательность символов, то есть текст. Пишется в одинарных, двойных или обратных кавычках:
| Синтаксис | Отличие | Когда |
|---|---|---|
'text' |
— | по умолчанию (соглашение в большинстве проектов) |
"text" |
то же, что ' |
когда в тексте есть ' |
`text ${x}` |
шаблонная строка: подстановка + несколько строк | когда текст смешивается с переменными |
Строки неизменяемы: ни один метод не меняет исходную строку, все возвращают новую.
const s = 'привет'
s.toUpperCase() // 'ПРИВЕТ'
s // 'привет' — без измененийМетоды на каждый день, по категориям
| Нужно... | Метод | Пример |
|---|---|---|
| убрать пробелы | trim(), trimStart(), trimEnd() |
' a '.trim() → 'a' |
| изменить регистр | toLowerCase(), toUpperCase() |
сравнения без учёта регистра |
| искать | includes(), startsWith(), endsWith(), indexOf() |
email.includes('@') |
| извлечь | slice(start, end), at(-1) |
'hello'.slice(0, 3) → 'hel' |
| разбить / склеить | split(sep) / arr.join(sep) |
'a,b'.split(',') → ['a', 'b'] |
| заменить | replace(), replaceAll() |
'a-b-c'.replaceAll('-', ' ') |
| дополнить | padStart(), padEnd() |
'5'.padStart(2, '0') → '05' |
| повторить | repeat(n) |
'ab'.repeat(2) |
slice или substring: используйте slice — он принимает и отрицательные индексы (slice(-3) = последние 3 символа).
Для сложных шаблонов (проверка, извлечение) есть регулярные выражения: /\d+/.test('abc123').
Что такое число
В JS один тип для чисел: number — 64-битное число с плавающей точкой (стандарт IEEE 754). Целые и дробные — один и тот же тип.
Знаменитое следствие:
0.1 + 0.2 // 0.30000000000000004Это не баг JS — так работает плавающая точка почти во всех языках. Деньги храните в целых копейках (1999 вместо 19.99) и форматируйте только при выводе.
Особые значения
| Значение | Когда появляется | Как проверить |
|---|---|---|
NaN («не число») |
неудачное преобразование: Number('abc') |
Number.isNaN(x) — не x === NaN (всегда false) |
Infinity |
1 / 0 |
Number.isFinite(x) |
Number.MAX_SAFE_INTEGER |
~9 квадриллионов | больше → bigint |
Преобразования string ↔ number
| Метод | '42' |
'42px' |
'' |
Когда |
|---|---|---|---|---|
Number(x) |
42 | NaN |
0 | строгое преобразование — по умолчанию |
parseInt(x, 10) |
42 | 42 | NaN |
прочитать число в начале текста |
parseFloat(x) |
42 | 42 | NaN |
то же, с дробной частью |
+x |
42 | NaN |
0 | сокращение для Number (хуже читается) |
String(n), `${n}` |
— | — | — | число → текст |
Значения из полей ввода и из FormData — всегда строки. Преобразуйте их явно.
Math
Math.round(2.5) // 3
Math.floor(2.9) // 2 (вниз)
Math.ceil(2.1) // 3 (вверх)
Math.max(1, 5, 3) // 5
Math.min(...arr) // минимум массива
Math.random() // [0, 1)
(3.14159).toFixed(2) // '3.14' — внимание, возвращает СТРОКУIntl — правильное форматирование без библиотек
Intl — нативный API для форматирования по языку и стране. Не пишите вручную разделители тысяч или названия месяцев.
| Форматтер | Для | Пример (ru-RU) |
|---|---|---|
NumberFormat |
числа, валюта, проценты | 1 234,50 ₽, 45 % |
DateTimeFormat |
даты и время | 8 октября 2026 г. |
RelativeTimeFormat |
относительное время | вчера, через 3 дня |
PluralRules |
выбор формы множественного числа | 1 сообщение / 3 сообщения / 5 сообщений |
ListFormat |
списки | HTML, CSS и JS |
const money = new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB' })
money.format(1234.5) // '1 234,50 ₽'
new Intl.DateTimeFormat('ru-RU', { dateStyle: 'long' }).format(new Date())
new Intl.RelativeTimeFormat('ru', { numeric: 'auto' }).format(-1, 'day') // 'вчера'Создавайте форматтер один раз (вне функции / компонента) и переиспользуйте — создание дорогое.
Коротко
- Строки неизменяемы; шаблонные строки — для подстановки.
- Один тип
number; деньги — в целых;Number.isNaNдля NaN. - Поля ввода дают строки — преобразуйте через
Number(). - Форматирование:
Intl, а не ручная склейка.