Введение: почему это важно?
Представьте ситуацию: вы пишете калькулятор чаевых на JavaScript. Пользователь вводит сумму счета в поле ввода, нажимает кнопку — и получает... undefined или, что еще хуже, строку "10010" вместо числа 110. Знакомо? Если вы только начинаете свой путь в программировании, проблема преобразования строки в число в JavaScript — одна из тех "граблей", на которые наступают абсолютно все.
На Stack Overflow вопрос "How can I convert a string to an integer in JavaScript?" собрал тысячи просмотров и сотни ответов. Это значит, что даже опытные разработчики иногда путаются в нюансах. Сегодня мы раз и навсегда разберемся, как правильно конвертировать строку в число в JavaScript, какие методы работают, а какие — нет, и почему результат иногда бывает неожиданным.
Готовы? Тогда поехали!
Зачем вообще преобразовывать строку в число?
JavaScript — язык с динамической типизацией. Это круто, потому что вы можете не думать о типах данных… пока не столкнетесь с багом. Проблема в том, что данные из prompt(), input полей форм, URL-параметров или API всегда приходят в виде строк. Даже если пользователь ввел "42", JavaScript видит не число, а набор символов.
Попробуйте сложить две строки:
let a = "10";
let b = "20";
console.log(a + b); // "1020"
Видите? Вместо суммы 30 вы получили конкатенацию. Чтобы этого избежать, нужно явно указать JavaScript: "Эй, это числа, работай с ними как с числами!".
Метод №1: parseInt() — классика жанра
Самый популярный способ преобразовать строку в целое число в JavaScript — это функция parseInt(). Она принимает строку и "выкусывает" из нее целое число, игнорируя все, что идет после цифр.
Синтаксис и примеры
let str = "42";
let num = parseInt(str);
console.log(num); // 42 (число)
// Работает даже с "мусором" после цифр
console.log(parseInt("123px")); // 123
console.log(parseInt("10.99")); // 10 (отбрасывает дробную часть)
// А вот если строка начинается не с цифры...
console.log(parseInt("abc123")); // NaN
console.log(parseInt(" 7")); // 7 (пробелы в начале игнорируются)
Важно: parseInt() останавливается на первом нечисловом символе. Если строка начинается с буквы — получите NaN (Not a Number).
Второй аргумент — система счисления
Мало кто знает, но у parseInt() есть второй параметр — radix (основание системы счисления). Это спасает от багов с восьмеричными числами:
// Без radix может быть путаница
console.log(parseInt("010")); // 10 (в старых IE могло быть 8)
// Всегда указывайте 10 для десятичной системы
console.log(parseInt("010", 10)); // 10
console.log(parseInt("FF", 16)); // 255 (шестнадцатеричная)
Совет от профи: всегда передавайте второй аргумент 10, если работаете с десятичными числами. Это делает код понятнее и безопаснее.
Метод №2: Number() — строгий, но честный
Функция Number() — это более строгий способ конвертировать строку в число в JavaScript. В отличие от parseInt(), она не терпит никаких посторонних символов.
console.log(Number("42")); // 42
console.log(Number("10.99")); // 10.99 (сохраняет дробную часть)
console.log(Number("123px")); // NaN (строка содержит лишние символы)
console.log(Number("")); // 0 (пустая строка = 0)
console.log(Number(" ")); // 0
Когда использовать: если вы на 100% уверены, что строка содержит только число (например, после валидации формы). Для пользовательского ввода лучше parseInt() или parseFloat().
Метод №3: Унарный плюс (+) — короткий и быстрый
Самый лаконичный способ преобразования строки в число в JavaScript — поставить перед ней плюс. Это оператор унарного плюса, и он работает аналогично Number().
let str = "42";
let num = +str;
console.log(num); // 42
// Другие примеры
console.log(+"10.99"); // 10.99
console.log(+"123px"); // NaN
console.log(+""); // 0
console.log(+true); // 1 (да, это тоже работает)
// Используется в реальном коде часто:
let total = +price + +tax; // быстрое преобразование двух строк
Плюсы: коротко, читаемо (для тех, кто знает этот трюк). Минусы: новички могут не понять, что происходит. Используйте, если пишете код для себя или в команде, где все знают этот прием.
Метод №4: Math.floor() и другие математические трюки
Иногда программисты используют математические операции для конвертации строки в число в JavaScript. Это работает, но выглядит как хак:
let str = "42";
console.log(str * 1); // 42 (умножение на 1)
console.log(str / 1); // 42
console.log(str - 0); // 42
console.log(Math.floor(str)); // 42 (только для целых)
Почему это работает? Любая математическая операция заставляет JavaScript преобразовать строку в число. Но будьте осторожны: Math.floor() округляет вниз и работает только с числами.
Стоит ли использовать? Лучше нет. Это неочевидный код, который может сбить с толку других разработчиков. Придерживайтесь явных методов.
Сравнительная таблица методов
Чтобы вы могли быстро выбрать подходящий способ, вот краткое резюме:
- parseInt("42px") → 42 (игнорирует хвост, только целые)
- parseFloat("10.99px") → 10.99 (игнорирует хвост, дробные)
- Number("42") → 42 (строго, но пустая строка = 0)
- +"42" → 42 (коротко, как Number)
- "42" * 1 → 42 (хак, не рекомендуется)
Типичные ошибки новичков (и как их избежать)
Ошибка 1: Забыть про NaN
Если результат преобразования —