Avatar ·

Как преобразовать строку в число (integer) в JavaScript: лучшие способы

Всем привет! Я только начал изучать JavaScript и столкнулся с проблемой. Мне нужно получить число из строки, например, из формы ввода, где пользователь вводит свой возраст. Я пробовал просто сложить две строки, но получается конкатенация, а не сложение. Вот пример моего кода: ```javascript let age1 = "25"; let age2 = "30"; let sum = age1 + age2; // Получается "2530", а не 55 console.log(sum); ``` Я понимаю, что строки нужно преобразовать в числа, но не знаю, как это сделать правильно. В интернете видел много разных способов: parseInt(), Number(), унарный плюс (+), но какой из них лучше? И в чём разница? Ещё слышал, что есть подводные камни, например, когда строка содержит не только цифры. Подскажите, пожалуйста, как надёжно и безопасно преобразовать строку в целое число (integer) в JavaScript? Буду благодарен за примеры и объяснения для новичков. <<>>

Основные способы преобразования строки в число

В JavaScript есть несколько способов преобразовать строку в целое число. Рассмотрим самые популярные и надёжные из них.

1. Функция parseInt()

Это классический способ. parseInt() разбирает строку и возвращает целое число. Важная особенность: он игнорирует нечисловые символы после цифр, но останавливается на первом недопустимом символе.

let str = "42px";
let num = parseInt(str);
console.log(num); // 42

let str2 = "  10  ";
let num2 = parseInt(str2);
console.log(num2); // 10 (пробелы игнорируются)

let str3 = "abc123";
let num3 = parseInt(str3);
console.log(num3); // NaN (не число, так как строка начинается с буквы)

Важно: Всегда указывайте систему счисления (radix) вторым аргументом, особенно при работе с числами, начинающимися с нуля:

let str4 = "010";
let num4 = parseInt(str4, 10); // 10 (десятичная система)
let num5 = parseInt(str4);      // 8 в старых браузерах (восьмеричная система)

2. Унарный плюс (+)

Самый короткий и часто используемый способ. Преобразует строку в число, но строго — если строка содержит нецифровые символы, вернёт NaN.

let str = "123";
let num = +str;
console.log(num); // 123

let str2 = "42.5";
console.log(+str2); // 42.5 (число с плавающей точкой)

let str3 = "123abc";
console.log(+str3); // NaN

3. Функция Number()

Работает аналогично унарному плюсу, но более явно показывает намерение.

let str = "256";
let num = Number(str);
console.log(num); // 256

let str2 = "  99  ";
console.log(Number(str2)); // 99

let str3 = "99.9";
console.log(Number(str3)); // 99.9

Что выбрать?

  • Если вы точно знаете, что строка содержит только целое число — используйте +str или Number(str). Это быстро и читаемо.
  • Если строка может содержать посторонние символы после числа (например, "100px") — используйте parseInt(str, 10).
  • Если строка может быть пустой или содержать только пробелы — помните, что parseInt вернёт NaN, а +"" или Number("") вернёт 0. Это может быть неожиданно.

Полный пример для вашей задачи

let age1 = "25";
let age2 = "30";

// Лучший способ для вашего случая:
let sum = parseInt(age1, 10) + parseInt(age2, 10);
console.log(sum); // 55

// Альтернатива:
let sum2 = +age1 + +age2;
console.log(sum2); // 55

Важные предостережения

  • Всегда проверяйте результат на NaN с помощью isNaN() или Number.isNaN().
  • Для дробных чисел используйте parseFloat() или +.
  • Не используйте parseInt без указания системы счисления — это может привести к ошибкам в старых браузерах.

Надеюсь, это поможет! Если будут вопросы — спрашивайте.

<<>>

Альтернативный подход: использование Math.floor() и ~~ (двойное побитовое НЕ)

Иногда в коде можно встретить экзотические способы преобразования. Рассмотрим два из них.

1. Math.floor() для чисел с плавающей точкой

Если вы уже получили число, но оно дробное, и вам нужно целое:

let str = "42.7";
let num = Math.floor(Number(str));
console.log(num); // 42 (отбрасывает дробную часть вниз)

Но помните: Math.floor() не преобразует строку в число сам — сначала нужно использовать Number() или +.

2. Двойное побитовое НЕ (~~)

Этот трюк работает только для 32-битных целых чисел (от -2^31 до 2^31-1):

let str = "123";
let num = ~~str;
console.log(num); // 123

let str2 = "42.9";
console.log(~~str2); // 42 (отбрасывает дробную часть)

let str3 = "10000000000"; // больше 2^31-1
console.log(~~str3); // 1410065408 (ошибка из-за переполнения)

Не рекомендуется использовать ~~ в production-коде, так как это ухудшает читаемость и может привести к неожиданным ошибкам при больших числах. Лучше использовать явные методы из первого ответа.