Нередко возникает необходимость преобразовать одни данные в другие. Некоторые преобразования javascript выполняет автоматически. Например:
const number1 = "56"; const number2 = 4; cont result = number1 + number2; console.log(result); // 564
Здесь константа number1 представляет строку, а точнее строковое представление числа. А константа number2 представляет число. И в итоге мы получим не число 60, а строку 564.
При сложении преобразования в JavaScript производятся по принципу:
Если оба операнда представляют числа, то происходит обычное арифметическое сложение
Если предыдущее условие не выполняется, то оба операнда преобразуются в строки и производится объединение строк.
Соответственно в примере выше, поскольку первый операнд - строка, то второй операнд - число также преобразуется в строку, и в итоге получаем строку "564", а не число 60. Фактически мы получаем:
const number1 = "56"; const number2 = 4; const result = number1 + String(number2); console.log(result); // 564
Выражение String(number2)
позволяет получить строковое представление константы number2, то есть из числа 4 получает строку "4".
Но поведение по умолчанию не всегда может быть желательно. Например, в примере выше мы хотим, чтобы значения складывались не как строки, а как числа. В этом случае мы можем использовать функции преобразования.
Для преобразования строки в целое число применяется функция parseInt():
const number1 = "56"; const number2 = 4; const result = parseInt(number1) + number2; console.log(result); // 60
При этом строка может иметь смешанное содержимое, например, "123hello", то есть в данном случае есть цифры, но есть и обычные символы.
Функция parseInt()
все равно попытается выполнить преобразование - она последовательно, начиная с первого символа, считывает цифры, пока не встретит первый
нецифровой символ:
const num1 = "123hello"; const num2 = parseInt(num1); console.log(num2); // 123
Стоит учитывать, что преобразуемое значение, которое преобразуется в число, всегда сначала преобразуется в строку. Это может приводить к неожиданным, на первый взгляд, результатам:
const number1 = parseInt(0.000005); // 0; console.log(number1); const number2 = parseInt(0.0000005); // 5 console.log(number2);
Выше в функцию parseInt передаются дробные числа, и мы ожидаем в обоих случаях получить число 0. Однако при преобразовании number2 мы получаем число 5. Почему?
Пример выше будет эквивалентен следующему:
const number1 = parseInt(String(0.000005)); // 0; console.log(number1); const number2 = parseInt(String(0.0000005)); // 5 console.log(number2);
Для дробных чисел меньше 10-6 (0.000001) применяется экспоненциональная запись, то есть число 0.0000005 представляется
как 5e-7
:
console.log(0.0000005); // 5e-7
Далее число 5e-7 преобразуется в строку "5e-7", и эту строку parseInt пытается преобразовать в число. Соответственно на выходе получается число 5.
То же самое касается очень больших чисел типа 999999999999999999999, которые также представляются к экспоненциальной форме.
Если функции parseInt()
не удастся выполнить преобразование, то он возвращает значение NaN (Not a Number), которое говорит о том,
что строка не представляет число и не может быть преобразована.
console.log(parseInt("abc")); // NaN cont type = typeof NaN; console.log(type); // number
Что интересно, само значение NaN (не число) представляет тип number, то есть число.
С помощью специальной функции isNaN() можно проверить, представляет ли строка число. Если строка не является числом, то функция возвращает true, если это число - то false:
const num1 = "javascript"; const num2 = "22"; let result = isNaN(num1); console.log(result); // true - num1 не является числом result = isNaN(num2); console.log(result); // false - num2 - это число
Для преобразования строк в дробные числа применяется функция parseFloat(), которая работает аналогичным образом:
const number1 = "46.07"; const number2 = "4.98"; let result = parseFloat(number1) + parseFloat(number2); console.log(result); //51.05
Стоит отметить, что для преобразования строки в число в JavaScript мы можем использовать оператор унарного плюса + перед преобразуемым значением:
const number1 = "56"; const number2 = 4; const result = +number1 - number2; console.log(result); // 52
Здесь выражение +number1
преобразует строку "56" в число 56.
Если надо получить отрицательное представление числа, то аналогичным образом применяется знак унарного минуса (как перед отрицательными числами):
const number1 = "56"; const number2 = 4; const result = -number1 - number2; // -56 - 4 = -60 console.log(result); // -60
Однако в примерах выше строка number1 могла быть преобразована в числа. Если это не возможно, то результатом преобразования будет значение NaN:
const number1 = "56hek"; console.log(+number1); // NaN